为什么我要在基类变量中实例化一个对象?

时间:2012-12-24 19:59:21

标签: c# oop

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

这在OOP中意味着什么?我什么时候想要这样做而不是仅仅创建一个SubClass对象?如果有人可以给我一个真实的例子,我真的会对它进行诠释。

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

4 个答案:

答案 0 :(得分:3)

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

Vehicle myWheels;

if (iHaveALicense) {
    myWheels = new Car();
} else {
    myWheels = new Bus();
}

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

public class NewSubClass : BaseClass

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

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

另一方面是这样的:

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

根本不会编译。

答案 3 :(得分:0)

这将被称为多态性。

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

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

现在,如果在基类中创建虚方法并在派生类中重写它们,然后将从animal派生的任何对象传递给该函数。然后makeSound将根据您传递的派生对象生成声音。

这样你就不必为每一种产生声音的动物制作这个功能。