什么是“向上”?

时间:2012-09-18 07:14:44

标签: oop definition upcasting

我可以看到“upcast”一词与OOP有关,但我无法通过搜索互联网找到确切的定义。

任何人都可以解释这个术语的含义以及这种技术在什么情况下有用?

2 个答案:

答案 0 :(得分:7)

根据您发布的代码说明:

  

Upcasting允许将子类类型的对象视为任何超类类型的对象。

基本上,它是将子类实例强制转换为其超类之一的地方,以伪代码显示示例

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等具有不同的模型和动画,填写空白方法。这些“空白”方法也可以称为抽象或纯方法。

答案 1 :(得分:1)

Upcasting基本上是一种对象创建机制,我们通过引用它们的基类来创建对象。我们通过在对象定义中用基类替换子类来完成此操作。当您知道创建的专用对象不一定会使用它提供的所有功能时,这尤其会派上用场。所以,用基类替换子类(继承的类),你所做的就是Upcasting。

如果我们举一个例子,这个概念可以很好地理解。让我们假设我们有三个类。一个父类或通用类称为LIVING_THINGS类,两个子类是ANIMAL和BIRD,它们继承自前者。父类或基类具有函数,比如Born()和Die()。专门的类具有函数,例如分别用于ANIMAL和BIRD的Run()和Fly()。

要创建ANIMAL和BIRD对象,通常使用以下语法:

ANIMAL animal = new ANIMAL();
BIRD bird = new BIRD();  

在上面的代码中,Run()和Fly()方法与创建的对象完美配合。这是您创建对象的常规方式。用于创建对象的引用与在运行时创建的对象类型完全相同。子类的方法工作正常。

但是,要创建Upcast,您可以使用以下语法:

LIVING_THINGS animal = new ANIMAL();

在上面的代码中,即使我们创建了ANIMAL和BIRD类型的对象,所使用的引用实际上也是基类。因此,方法Run()和Fly()不可用于这些对象。相反,只有基类中可用的函数,如Born()和Die()可用。 如果您只想在开始时使用基本功能并希望稍后转换其原始类型的这些对象以使其专用功能可用,则此功能非常有用。这可以在Downcasting的帮助下完成。向下转换可以将这些对象的引用类型更改为专用子类,以使其他函数不可用。请观看以下代码:

ANIMAL new_animal  = animal as ANIMAL;

在上面的代码中,我们创建了一个新对象并将其转换为ANIMAL类型。实际检查要转换的对象是否支持转换应该是一个好习惯。这可以在is关键字

的帮助下完成
if (animal is ANIMAL)

{

     ANIMAL new_animal  = animal as ANIMAL;

     new_animal.Run();

}

在Downcasting的帮助下,我们恢复了ANIMAL对象应具备的所有功能和属性。现在它表现为一个合适的ANIMAL对象。