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);
     }
    } ///:~

  • 相关阅读:
    【转载】Linux 内存管理机制
    【学习笔记】cache/buffer
    【错误记录】PowerShell 超级无语的语法错误(令人怀疑人生)
    【Ansible 文档】【译文】模版(Jinja2)
    【Ansible 文档】【译文】Playbooks 变量
    【Ansible 文档】提示、推荐、注意事项
    【Ansible 文档】【译文】网络支持
    银行卡算法规则
    网站优化:浏览器缓存控制简介及配置策略
    学习一份百度的项目目录结构规范
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4379916.html
Copyright © 2011-2022 走看看