[英]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
函数/属性。 您想做一辆汽车可以做的事情,并且不在乎它是CrapCar
, NiceCar
还是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.