2

我是一名初级程序员(目前正在使用 Java),我正在练习类、对象和继承/多态。我对多态性有用的整个想法感到困惑。让我举一个像真人快打这样的格斗街机游戏的例子。如果您创建一个名为 Fighter 的类,其中包含设置健康、获取健康、移动等的变量和方法。然后您转到主类并创建一个类似的对象Fighter Scorpion = new Fighter();然后您可以创建许多其他对象格斗类。Fighter Cobra = new Fighter();或者Fighter Subzero = new Fighter();然后您只需像这样通过单独的 Fighter 类对象( The fighters )访问这些方法,

Subzero.setHealth(100);
Subzero.SetShield(200);
Subsero.Move(punch);

Scorpion.SetHealth(200);

...

您将如何使用继承这一主题?根据我的阅读,我相信它用于做相同类型的事情,而是为该类设置细节,而不是所有对象都具有相同的方法等。例如在我的示例中,您创建了一个派生自 Fighter 类的新 Scorpion 类,然后您可以添加特定于 Scorpion 类的 ScorpionAttack 方法。所以你可以做这样的事情......

 Scorpion.setHealth(200); // From the main Fighter class
 Scorpion.ScorpionAttack; // From the specific derived class Scorpion  

我不知道我是否完全理解继承的整个概念以及它如何变得有用。我的完整问题是我对继承的想法是完全正确的还是我错过了一点?

4

3 回答 3

2

您示例的主要思想是Fighter可以有一个方法attack(),但是在每个子类中您都有不同的实现。例如,Scorpion 会投掷他的长矛,而 Subzero 会做他的冰冻动作。

于 2013-05-17T00:55:01.470 回答
1

想想像真人快打这样的游戏中屏幕的图形渲染。有很多元素必须绘制:记分牌、健康条、计时器、背景、前景、战士等。在某种抽象级别上,每个战士也是“可绘制的”,就像其他界面元素一样,可能有一个绘制自身的具体方法。

继承是一种对“IS-A”关系建模的方法,因此您可以在程序的某些部分使用越来越多的通用抽象。请参阅 Liskov 替代原则以了解其好处和限制。

继承也可以用于重用代码:方法 Drawable.drawLine() 可以被许多不同的类使用。

多态性是面向对象语言的一个特性,它可以根据调用方法的特定对象的运行时类轻松地将方法调用分派到许多不同的代码路径。将其视为一种转换方式:

(pseudocode)
subzero.draw() into subzero.getClass().draw(this=subzero) 
// Figher.draw(this=subzero)
healthbar.draw() into healthbar.getClass().draw(this=healthbar) 
// Healthbar.draw(this=subzero)

虽然继承会以这种方式在类的层次结构中追逐实现:

(pseudocode)
Fighter.draw(this) into 
if Figher class defines method draw(Drawable this)
     execute function code from Fighter.java
else super(Figher).draw(this)

super(Class) 使类在继承层次结构上更上一层楼。

于 2013-05-17T01:29:04.330 回答
0

看起来像这样:

考虑现实世界的对象(它的面向对象:))

你有一个 Vehicle 类。

其他 3 个类:卡车、公共汽车和汽车继承自车辆(继承一些行为)

使用多态性(方法覆盖),您可以覆盖父类的默认行为(此处为车辆)。

因此,现在当您在 Vehicle 上调用 horn() 方法时(假设您使用 Vehicle 作为参考变量......),您可以让 Car peep peeeep、bus pom pom pmmmm ....父方法在其子类中的不同实现,并且在运行时根据对象类型动态调用方法。

于 2013-05-17T01:42:39.257 回答