【问题标题】:Inheritance Use? General Programming继承使用?一般编程
【发布时间】:2013-05-17 00:50:06
【问题描述】:

我是一名初级程序员(目前使用 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  

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

【问题讨论】:

    标签: java computer-science


    【解决方案1】:

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

    【讨论】:

    • 这个想法是当你得到一个Fighter 变量时,你知道你可以使用它的attack 方法,即使你不知道它到底是如何 做到的.当然,Fighter 应该定义一个 contract 来指定 what attack 做了什么,并且实现应该遵循该契约。
    【解决方案2】:

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

    继承是一种对“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) 让类在继承层次上更上一层楼。

    【讨论】:

      【解决方案3】:

      如下所示:

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

      你有一个 Vehicle 类。

      其他3个类:卡车、巴士和汽车继承自Vehicle(继承一些行为)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 2012-09-23
        相关资源
        最近更新 更多