多态可以做什么继承不能?

时间:2017-02-06 05:45:49

标签: java oop inheritance design-patterns polymorphism

想象一下,我们有一个类Animal,可以扩展到其他三个类:DogCatBird

此动物类具有talk()move()功能。谈话功能输出“动物说话”,移动功能输出“动物移动”。

对于狗来说,这是“狗动”和“狗吃”。对于CatBird类,这种差异与“Cat moving”等并列。

现在,由于多态性,如果我做

Animal charlietheBird = new Bird()

然后调用

charlietheBird.talk()

将输出

  

Bird talk

因为输出是在运行时确定的,因为编译器知道charlie是类Animal的{​​{1}}类型。

但是!

我可以简单地做

Bird

然后调用Bird charlietheBird = new Bird(); 会给出相同的输出,因为 方法会被覆盖。

3 个答案:

答案 0 :(得分:4)

  

多态可以做什么,继承可以&#t; t?

Polymorphism 的真正优势可以在运行时而不是编译时看到。多态性允许您将一个实现替换为另一个实现,而无需更改使用它的代码。让我们以Vet层次结构为例。让我们说你有一个class Vet { private Animal animal; public Vet(Animal animal) { this.animal = animal; } public void perfromCheckup() { animal.talk(); animal.poop(); } } 知道如何对任何动物进行健康检查(是的,他是一个上司)。

Vet vetWithBird = new Vet(new Bird());
Vet vetWithDog =  new Vet(new Dog());
vetWithBird.performCheckup();
vetWithDog.performCheckup();

你现在可以说:

Vet

注意如何告诉BirdDogVet或任何其他动物进行检查,而无需更改Dog课程。在运行时,Bird会在进行检查时发出警告,Animal会在进行检查时发出推文。想象一下,如果代替VetBird有一个class Vet { private Bird bird; public Vet(Bird bird) { this.bird = bird; } public void perfromCheckup() { bird.talk(); bird.poop(); } } 引用:

Vet

穷人Bird现在只能使用Vet。告诉您Dog使用Vet vetWithBird = new Vet(new Bird()); //Works fine. Vet likes birds. Vet vet = new Vet(new Dog())// compilation error. Sorry I don't like dogs. ,他会立即拒绝此问题。

var table = $('.tableContent').DataTable({    
    "autoWidth": false,    
    "pageLength": 50,    
    dom : 'lBfrtip',    
    buttons : [ {    
        extend : 'excel',    
        text : 'Export to Excel',    
        exportOptions : {   
            modifier : {    
                // DataTables core    
                order : 'index',  // 'current', 'applied', 'index',  'original'    
                page : 'all',      // 'all',     'current'    
                search : 'none'     // 'none',    'applied', 'removed'    
            }    
        }    
    } ],

    "columnDefs" : [{    
        "targets" : [ 0, 1, 2, 8, 9, 10, 11,  17, 18 ],    
        "visible" : true,    
        "searchable" : true    
    }, {    
        "targets" : [ 3, 4, 5, 6, 7, 12, 13, 14, 15, 16, 19, 20, 21 ],    
        "visible" : false,    
        "searchable" : false    
    }]    
});

总之, Polymorphism 允许您替换使用超类引用的子类实例。 继承允许您从父类继承代码并可能在子类中重新定义该行为,以便您的代码可以在运行时通过 Polymorphism

利用它

答案 1 :(得分:2)

继承是指Java编程的一项功能,它允许您创建从其他类派生的类。基于另一个类的类继承另一个类。继承的类是父类,基类或超类。

多态性是指编程语言根据数据类型或类别以不同方式处理对象的能力。更具体地说,它是重新定义派生类的方法的能力。

You can find more information in Objects and Java by Bill Venners Chapter 7: Polymorphism and Interfaces

答案 2 :(得分:2)

继承支持多态,但多态不依赖于继承。

您举例说明了如何通过继承来实现多态性。

但你可以用不同的方式看待它:

移动概念有一个接口

interface Movable{
  void move();
}

动物可以实现此界面:

class Dog implements Movable {
  @Override
  public void move(){
    // move the animal
  }
}

但是一些真菌也可以移动:

class SlimeMold implements Movable {
  @Override
  public void move(){
    // move the animal
  }
}

很难找到这两者之间的“是一种”关系,这种关系可以通过继承来表达,但是当两者都实现相同的接口时,我们仍然可以对它们应用多态性:

Collection<Movable> movables = new HashSet<>();
movables.add(new Dog());
movables.add(new SlimeMold());
for(Movable movable : movables)
   movable.move();