簡體   English   中英

將接口轉換為其具體實現對象,反之亦然?

[英]Cast interface to its concrete implementation object or vice versa?

在C#中,當我有一個接口和幾個具體實現時,我可以將接口轉換為具體類型還是具體類型轉換為接口?

這種情況下的規則是什么?

Java和C#中允許使用這兩個方向。 向下轉換需要顯式轉換,如果對象的類型不正確,則可能拋出異常。 然而,向上轉換不需要明確的轉換,並且總是安全的。

也就是說,假設你有public interface Animal和這個interface兩個實現, CatDog ....

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM