繁体   English   中英

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

[英]Abstract class on left side of object instantiation in C#

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

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();

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都可以鸣喇叭。

也可以看看

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()方法可能只需要在父类中编写,这有助于使代码更小。

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

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

AbstractClass MyClass = new ConcreteClass();

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

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

上流

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM