关于在对象实例化左侧使用抽象类,我有两个问题。
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();
答案 0 :(得分:4)
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 :(得分: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