[英]Cast interface to its concrete implementation object or vice versa?
在C#中,當我有一個接口和幾個具體實現時,我可以將接口轉換為具體類型還是具體類型轉換為接口?
這種情況下的規則是什么?
Java和C#中允許使用這兩個方向。 向下轉換需要顯式轉換,如果對象的類型不正確,則可能拋出異常。 然而,向上轉換不需要明確的轉換,並且總是安全的。
也就是說,假設你有public interface Animal
和這個interface
兩個實現, Cat
和Dog
....
Animal meowAnimal = new Cat(); // No cast required
Animal barkAnimal = new Dog(); // No cast required
Cat myCat = (Cat) meowAnimal; // Explicit cast needed
Dog myDog = (Dog) barkAnimal; // Explicit cast needed
Dog myPet = (Dog) meowAnimal; // Will compile but throws an Exception
你會想要一個關於顯式轉換的try
/ catch
。 在C#中,您有一個有用as
關鍵字:
Dog myDog = barkAnimal as Dog;
Dog myPet = meowAnimal as Dog;
不會拋出異常,myDog將為nonNull,myPet將為null。 雖然您始終可以使用if (meowAnimal instanceof Dog)
測試來保持類型安全,但Java沒有等效的關鍵字。 (我猜想“ as
”關鍵字會生成執行if的字節碼,但是指定的null is
失敗的。但是.NET可能會有一個字節碼指令,它相當於“ as
”。)
在大多數語言中,您可以投射兩個方向。 如果您有一個具體的類,則可以將其強制轉換為接口。 如果您有一個接口,則可以轉換為具體類。
一般來說,你只想進入第一個方向。 原因是當您只有指向接口的指針時,您不應該知道具體類是什么。 如果您將某些東西作為界面傳遞,您應該能夠從該界面做任何您需要的事情。 如果您發現自己需要使用不在界面上的具體對象的部分,那么您應該修復一個設計問題而不是強制轉換。
如果你在談論Java(但其他語言的規則是相似的),它是這樣的:
您可以(向下)將接口強制轉換為具體實現,如果您實際投射的引用是對特定具體實現的引用。 這意味着
Vehicle v=new Car();
(Car)v // this is OK
(Bus)v // this is not
該錯誤在Java中表現為ClassCastException
。
您可以自由地向接口轉發接口的具體實現。
接口可以是整個類,如果不是必須的話,最好在創建接受接口作為參數的構造函數並復制設置時,這樣您就可以控制發生的事情和需要的內容。
兩者都是有效的,因為它是合乎邏輯的演員。 很多時候,您的界面消費者無法訪問具體類,這是首先擁有界面的一個主要原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.