簡體   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