zoukankan      html  css  js  c++  java
  • 理解多态

    //为什么要上转型

    //Note.java

    package c07;

    public enum  Note{middleC,cSharp,cFlat;}

    //Music.java

    package c07;

    class Instrument {
    public void play(Note n) {
    System.out.println("Instrument.play()");
    }
    }


    class Wind extends Instrument {
    public void play(Note n) {
    System.out.println("Wind.play()       "+n);
    }
    }


    class Wind2 extends Instrument {
    public void play(Note n) {
    System.out.println("Wind2.play()      "+n);
    }
    }


    public class Music {
    public static void tune(Instrument i) {
    // ...
    i.play(Note.middleC);//关键是这里 i    play  
    }
    public static void main(String[] args) {
    Wind flute = new Wind();
    tune(flute); // Upcasting
    Wind2 flute2 = new Wind2();
    tune(flute2); // Upcasting
    }
    } ///:~

    //不用上转型,很麻烦


    //: Music2.java
    //Overloading instead of upcasting
    class Note2 {
     private int value;
     private Note2(int val) { value = val; }
     public static final Note2
     middleC = new Note2(0),
     cSharp = new Note2(1),
     cFlat = new Note2(2);
    } // Etc.
    class Instrument2 {
     public void play(Note2 n) {
      System.out.println("Instrument2.play()");
     }
    }
    class Wind2 extends Instrument2 {
     public void play(Note2 n) {
      System.out.println("Wind2.play()");
     }
    }
    class Stringed2 extends Instrument2 {
     public void play(Note2 n) {
      System.out.println("Stringed2.play()");
     }
    }
    class Brass2 extends Instrument2 {
     public void play(Note2 n) {
      System.out.println("Brass2.play()");
     }
    }
    public class Music2 {
     public static void tune(Wind2 i) {
      i.play(Note2.middleC);
     }
     public static void tune(Stringed2 i) {
      i.play(Note2.middleC);
     }
     public static void tune(Brass2 i) {
      i.play(Note2.middleC);
     }//相对于上转型是多余的

     public static void main(String[] args) {
      Wind2 flute = new Wind2();
      Stringed2 violin = new Stringed2();
      Brass2 frenchHorn = new Brass2();
      tune(flute); // No upcasting
      tune(violin);
      tune(frenchHorn);
     }
    } ///:~

  • 相关阅读:
    ES6扩展
    javascript当中prototype用法
    三列浮动中间宽度自适应
    介绍axios和promise
    JS高级---实例对象和构造函数之间的关系
    JS-数组常用方法整理
    原生JS轮播图
    JavaScript 开胃菜
    JS高级---遍历DOM树
    JS高级---正则表达式练习身份证号码
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4379916.html
Copyright © 2011-2022 走看看