2
BaseClass obj = new SubClass(); // Subclass : BaseClass

这在 OOP 中意味着什么?我什么时候想这样做而不是仅仅创建一个 SubClass 对象?如果有人能给我一个真实的例子,我真的很感激。

obs:我知道关于虚拟方法和东西有一些副作用,但我在这里真正感到困惑的是它的概念和用途。

4

4 回答 4

3

我能想到的最常见原因是在可以将多种类型的子类分配给该变量的范围内:

Vehicle myWheels;

if (iHaveALicense) {
    myWheels = new Car();
} else {
    myWheels = new Bus();
}
于 2012-12-24T20:03:31.757 回答
2

一个非常简单的例子是考虑一个工厂类。如果一个类依赖于 some Factory<T>,您可以使用继承注入“具体”版本。消费类不关心具体版本如何工作,只关心它实现了一些契约。

“这在 OOP 中是什么意思?” - 在 C# 中,这意味着SubClass继承所有关于BaseClass并可以访问其中的所有内容BaseClass,减去私有成员。通过这样做,在任何BaseClass需要 a 的地方,SubClass都可以使用 a 来代替它。在我的示例中,您可以通过公开抽象基类来定义工厂应该做什么。然后继承类可以自由地实现该行为,而无需任何消费者关心工作是如何完成的。

(这只是一个例子——继承,当不被滥用时,是一种非常强大的工具。)

于 2012-12-24T20:02:27.597 回答
2

假设您有另一个继承 BaseClass 的类:

public class NewSubClass : BaseClass

当您按照显示的方式初始化对象时,您可以这样做:

BaseClass obj = new SubClass();
obj = new NewSubClass();

另一方面是这样的:

SubClass obj = new SubClass();
obj = new NewSubClass();

根本不会编译。

于 2012-12-24T20:03:46.000 回答
0

那将被称为多态性。

假设有一个以基类为参数的函数。

void my_function(Animal ani)
{
  Console.WriteLine(ani.makeSound());
}

现在,如果您在基类中创建虚拟方法并在派生类中覆盖它们,然后将任何从动物派生的对象传递给函数。然后 makeSound 会根据你传递的派生对象生成声音。

这样你就不必为每一种产生声音的动物都创建这个函数。

于 2012-12-24T20:16:11.317 回答