我可以看到术语"upcast"与OOP有关,但我在互联网上搜索找不到确切的定义。
有人能解释一下这个词的意思吗?在什么情况下这种技术有用吗?
根据您发布的标签描述:
Upcasting允许将子类类型的对象视为任何超类类型的物体。
基本上,它是将子类实例强制转换为其超类的地方,以在伪代码中显示一个示例
class Base {
function say_hi() { printf("Hello From Base Classn"); }
}
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等,并填充空白方法。这些"空白"方法也可以称为抽象方法或纯方法。