C#中对象实例化左侧的抽象类

时间:2018-09-25 08:29:57

标签: c# polymorphism abstract-class

关于在对象实例化左侧使用抽象类,我有两个问题。

AbstractClass MyClass = new ConcreteClass();

1-这叫什么?(当您在左侧声明抽象类时)。

例如

Car MyNiceCar = new NiceCar();

我知道这与多态性有关,但是我要特别问的是,在左侧声明抽象类时如何描述/语言化场景。

2-为什么这么做?,即为什么要这么做:

Car MyNiceCar = new NiceCar();

不是:

NiceCar MyNiceCar = new NiceCar();

问题2的答案是否可能是我可以做以下事情?

Car MyNiceCar = new NiceCar();

.
. //do some logic to decide if I can have a nicer car.
.

MyNiceCar = new EvenNicerCar();

3 个答案:

答案 0 :(得分:4)

1)您正在创建对派生类的基类引用。
编辑:
BaseClass的其他词语:SuperClass,ParentClass
DerivedClass的其他词:SubClass,ChildClass 不要问为什么每个单词都有这么多单词。这有点像Spaces vs Tabs类型的东西。

2)执行此操作,以便可以使用所有派生类都将拥有的virtual函数/属性。您想做汽车可以做的事情,而不必关心它是CrapCarNiceCar还是SuperNiceCar

Car car = new MyNiceCar();
car.honk(); //meep!
car = new SuperNiceCar();
car.honk(); //beep beep!

但是,您不能反其道而行之。

SuperNiceCar可能支持UseTurbo(),但MyNiceCar不支持。

但是您不在乎,您只是想将汽车鸣喇叭,所以将其投射为Car,因为您知道所有Car都可以鸣喇叭。

Read more about environments

答案 1 :(得分:2)

1-这叫什么?

这是一种多态性,称为“包含多态性”。它允许您对可以在代码中使用的变量的类型进行限制,同时仍然允许某些类型的灵活性。例如,Java和C#具有允许各种类型和引用使用同一代码的泛型。但是,这些通常会遇到运行时问题,否则静态代码分析器可能会捕获这些问题。通常认为,使用静态分析器(假设您的IDE很好)比发布后等待发现代码中包含错误的风险要小。

2-为什么这么做?

除了我上面给出的原因外,这种形式最常见的应用之一就是多态数组。

请考虑以下内容:

// Both classes contain an Accelerate() function
NiceCar MyNiceCar = new NiceCar();
EvenNicerCar MyEvenNicerCar = new EvenNicerCar();

// We're forced to use these methods separately
MyNiceCar.Accelerate();
MyEvenNicerCar.Accelerate();

////////////////////////////////////////////////////////////////////////////////////////////////////

// We can make this code much smaller and less prone to copy/paste errors using polymorphism!
Car[] MyPolymorphicArray = new Car[] { new NiceCar(), new EvenNicerCar() };
foreach(c in MyPolymorphicArray) { c.Accelerate(); }

使用这种类型的语法,您可以看到我能够使代码更小,更易于管理,类型安全,并且如果我们弄错了代码,我们的静态代码分析器将抱怨,而不是等到运行时再执行。找出。使用这种类型的体系结构时,请确保要求实例打算使用的方法位于该对象的接口或父类中,以帮助避免实现错误。此外,请注意,如果执行此操作,则Accelerate()方法可能只需要在父类中编写,这有助于使代码更小。

答案 2 :(得分:2)

紧接着来自@Mars和@ chris-mauer的两个出色答案,它们都完美地回答了我帖子的问题2。并且允许我进一步研究这个概念。

我想将我的帖子的问题1 的答案包括在内。我问:

AbstractClass MyClass = new ConcreteClass();

1-这叫什么?(当您在左侧声明抽象类时)。

从下面的文章中,我相信正确的答案是:

上传

有关整体概念(包含多态性)的更多信息,我研究了以下文章:http://www.msdotnet.co.in/2014/05/how-to-implement-polymorphism-concepts.html