繁体   English   中英

继承与多态之间的区别

[英]Difference between inheritance & polymorphism

我在理解什么是多态性以及它与继承有何不同方面存在问题。 我研究了网络,并找到了许多答案,这些答案对多态性是什么提供了非常技术上的定义,但我对它的理解并不多。 我想出了一个例子,可能是多态性,但可能不是。

我的例子:

假设您拥有一个拥有许多会员级别的体育馆。

  1. 基本成员
  2. 银卡会员
  3. 黄金会员

每个班级都是基本成员,但功能更多

class basicMember(){
private double rate = 10;
privatedbl poolPrice = 5;

public void setRate (dbl in);
{
 rate = in;
}
public dbl getRate()
{
 return rate;
}
public dbl getPoolPrice()
{
 return poolPrice;
}
} 

class silverMember extends basicRate()
{
 private dbl poolPriceDis = .9;
setRate(15);

public dbl getPoolPriceDis(){
return getPoolPrice() * poolPriceDis;
}
 } 

class goldMember extends basicRate(){
private dbl poolPriceDis = .85;
setRate(20);

public dbl getPoolPriceDis(){
return getPoolPrice() * poolPriceDis;
}
}

这是继承或多态性还是两者的一个例子? 请解释.....

您的示例演示了继承。

  • 多态使您可以在不知道类的确切类型的情况下调用类的方法。 它处理程序如何决定其应使用的方法,具体取决于程序具有的对象类型。 如果您有一个动物,它具有一个eat方法,并且您有一个Cow扩展了Animal,它具有自己的Eat实现,则调用哪种方法取决于您是否有指向Animal或Cow的指针。

多态允许您编写适用于任何Animal的方法:

public void pet(Animal animal) {
   ...
}

此方法将接受Dog,Cat等,包括尚未编写的Animal子类。

  • 继承使派生类共享其基类的接口和代码。 这是“类”从现有“类”派生的时间。 因此,如果您有Animal类,那么您有一个Cow类扩展了Animal,Cow继承了Animal具有的所有内容(取决于访问修饰符)。

    公共类动物{...}

    公共课狗延伸动物{...}

    Dog d = new Dog();

    d.DoAnimalStuff();

任何语言的继承都是一种多态性。 多态是指以相同的方式处理多个事物(多个类,多个函数等)的能力。 Inheretance允许这样做,因为您可以将任何类型视为基类。 Java中多态的另一种形式是泛型-您可以传递任何类型,只要它定义了您需要的所有功能即可。

继承是一个逻辑与另一个具有相同逻辑的对象。 继承可以节省代码行。

多态性允许将多个对象安全地存储在同一位置,并使用相同的代码进行操作

假设db继承/暗示

Base b = new Derived d;

b.DoThingsThatBasesCanDo();

您的示例只是继承,但是根据您的用法,它可能会变成多态

如果poolPriceDis是基类的成员,则它会更加多态,您可以在派生类中重写它,或者在各自类的构造函数中对其进行初始化。

使用Java ...

继承是定义添加或扩展另一个类的类的概念。 也可以更改类别。 例如,老板可以通过增加要求加薪的能力来扩展员工。

public class Employee
{
    ...
}

public class Boss extends Employee
{
    public void askForRaise(){}
}

多态,可以使用几种方法。 让我们看看其中两个。 首先,不同的类可以使用相同的方法执行不同的操作,例如,我们可以定义一个Shape类,该类表示所有形状并具有draw方法。

public abstract class Shape
{
    public abstract void draw();
}

正方形将执行绘制以绘制正方形,而圆形将绘制圆形。 两者都绘制但做不同的事情,这是第一种多态。

public class Square extends Shape
{
    public void draw(){...}
}

public class Circle extends Shape
{
    public void draw(){...}
}

值得注意的是,在此示例中我们还使用了继承。 Square和Circle从Shape继承,因此它们具有Shape具有的所有方法和属性。

Java中出现的第二种多态性是具有相同方法和不同参数的能力。 例如,一个数字可能有一个采用整数的加法,而另一个则采用双精度法:

public class MyNumber
{
    public void add(int i){...}
    public void add(double d){...}
}

具有相同方法的两个版本是多态的另一种形式。

多态有多种形状和大小,其中之一就是继承。

继承使您可以像使用同一类一样使用对象,而实际上它们可能是不同的类。 查看示例代码。

通过重载,您可以将具有不同类型参数的函数用作相同的函数。 例如:add(“ hello”,“ world”)和add(1,2)。

参数化使您可以使用与类型无关的函数或类,只要您事先告知即可。 例如:Vector <Float>与Vector <String>。

在所有情况下,您都会看到此“不同/许多”(多边形)充当“相同/相似形状”(变形)。

引用面向对象设计与模式中的 Cay Horstmann先生:

为特定对象选择适当方法的能力称为多态性 (术语“多态”的字面意思是“具有多种形状”。)

您可以使用继承对类之间的关系进行建模,其中一个类代表一个更通用的概念,另一个代表更专业的概念。

就您而言,您只是在使用继承。 但是,如果您要覆盖SilverMember类中的setRate setRate()方法,并且在主类中具有以下内容:

basicMember member = new silverMember();
member.setRate(20);

然后,尽管您具有basicMember变量,但将调用silverMember类的setRate() 那是多态性。

-

如果我不建议您如果您不了解这种事情,那么我对自己不忠实。 尝试阅读我在评论开头引用的书。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM