2

我在理解多态究竟是什么以及它与继承有何不同时遇到了问题。我研究了网络并找到了许多答案,这些答案给出了关于什么是多态性的非常技术性的定义,但没有什么是我真正理解得很好的。我想出了一个可能是多态性但可能不是的例子。

我的例子:

假设您有一个拥有多个会员级别的健身房。

  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;
}
}

这是继承或多态或两者兼而有之的例子吗?请解释.....

4

6 回答 6

3

您的示例演示了继承。

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

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

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

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

  • 继承允许派生类共享其基类的接口和代码。当一个“类”派生自一个现有的“类”时。因此,如果您有一个 Animal 类,那么您就有一个扩展 Animal 的 Cow 类,Cow 继承了 Animal 拥有的所有东西(取决于访问修饰符)。

    公共类动物 {...}

    公共类狗扩展动物{...}

    狗 d = 新狗();

    d.DoAnimalStuff();

于 2013-06-17T21:55:49.500 回答
1

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

于 2013-06-17T21:56:42.000 回答
1

继承是一个对象与另一个具有一些额外逻辑的对象具有相同的逻辑。继承为您节省了几行代码。

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

假设d继承/暗示b

Base b = new Derived d;

b.DoThingsThatBasesCanDo();

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

如果它是基类的成员,它将更加多态poolPriceDis,并且您可以在派生类中覆盖它或在各自类的构造函数中对其进行初始化

于 2013-06-17T21:58:54.183 回答
1

使用 Java...

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

public class Employee
{
    ...
}

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

多态性,可以使用几种方式。让我们看看其中的两个。首先,不同的类可以用同一个方法做不同的事情,比如我们可以定义一个Shape类来表示所有的形状,并且有一个draw方法。

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

一个正方形会执行draw来画一个正方形,而一个圆会画一个圆。两者都画,但做不同的事情,这是第一种多态。

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

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

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

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

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

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

于 2013-06-18T05:16:27.300 回答
0

Polymorphism comes in many shapes and sizes, one of which is inheritance.

Inheritance lets you use objects as if they were of the same class, where in reality they may be different classes. See your example code.

Overloading lets you use functions with parameters of different types as if they were the same. For example: add("hello", "world") and add(1, 2).

Parametrization lets you use functions or classes that don't care about the type, as long as you tell it in advance. For example: Vector<Float> versus Vector<String>.

In all cases you see this "different/many" (poly) acting as the "same/similar shape" (morph).

于 2013-06-17T22:09:23.793 回答
0

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

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

您使用继承来建模类之间的关系,其中一个类代表一个更一般的概念,另一个代表一个更专业的概念。

在您的情况下,您只是使用继承。但是,如果你要覆盖,比方说,你setRate()在 silverMember 类中的方法,并且主要有这样的东西:

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

然后setRate()虽然您有一个 basicMember 变量,但仍会调用 silverMember 类。这就是多态性。

--

如果我不建议你不要做这个采访,如果你不知道这种事情,我不会对自己诚实。尝试阅读我在评论开头引用的书。

于 2013-06-17T22:17:57.403 回答