【问题标题】:what is "upcast"?什么是“向上”?
【发布时间】:2012-09-18 07:14:43
【问题描述】:

我可以看到“upcast”这个词和OOP有关,但是我在网上搜索找不到确切的定义。

谁能解释一下这个术语是什么意思以及这种技术在什么情况下有用?

【问题讨论】:

  • 我不确定,但我认为这是您转换回父类的地方。例如,去阅读任何关于多态性的文章。
  • 我不能说我真的知道这个定义是什么,但我猜想@slugonamission 是正确的。

标签: oop definition upcasting


【解决方案1】:

根据您发布的标签的描述:

向上转换允许子类类型的对象被视为任何超类类型的对象。

基本上,您可以将子类实例强制转换为其超类之一,以显示伪代码示例

class Base {
    function say_hi() { printf("Hello From Base Class\n"); }
}

class Person extends Base {
    function say_hi() { printf("Hello!"); }    // Overridden. Java expects an @Override annotation
}

class Dog extends Base {
    function say_hi() { printf("Woof!"); }    // Again, overridden
}

Base B = new Base();
Base P = new Person();   // Implicit upcast
Dog dog = new Dog();
Base D = (Base)Dog();    // Explicit upcast

B.say_hi(); // Hello from base class
P.say_hi(); // Hello!
D.say_hi(); // Woof!

这在很多时候很有用。一般来说,它定义了一个接口,所以你可以子类化一些东西,但仍然在它的原始上下文中使用它。假设你有一个游戏,你会有一个敌人的对象。这有一些共同的功能,比如它的当前位置、速度、健康和其他东西。尽管如此,一些敌人可能会以不同的方式移动,可能会播放不同的死亡动画,当然,也会以不同的方式绘制。问题是,由于它们具有相同的界面,因此您不希望必须使用特殊代码来处理每种不同类型的敌人。

用这些字段和空方法创建一个基本的“Enemy”类是有意义的,然后将其扩展为具有不同模型和动画的 SmallEnemy、EvilEnemy、BossEnemy 等,并填充空白方法。这些“空白”方法也可以称为抽象或纯方法。

【讨论】:

  • 一个问题,既然你已经将D转换为Base,你怎么能访问Dog的say_hi()?我觉得很难理解。你能给我一个具体的例子而不是伪代码吗?
  • 我同意你的观点,但你应该在伪代码中添加一个提示,狗和人扩展基地。
  • @Dan - 哎呀,谢谢。这就是你早上编码所得到的。
  • @can。 - 对不起,我错过了你的问题。在这种情况下,您正在对当前对象调用 say_hi 方法。因为 D 对象继承自 Base,您可以将其强制转换回 Base,但它仍然保留相同的方法,因此您可以不用这样做。
  • 另外,这是使用跳转表实现的。想象一下,你的类有一个方法表。在 Dog 的情况下,表格的格式与 Base 相同,但我更改了其中的一个条目,因此当我转换为 Base 时,我仍然可以使用现有的方法表,即使一个单元格的实际内容是不同。
猜你喜欢
  • 2012-06-18
  • 2015-03-13
  • 2012-06-29
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多