[英]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.