2012-11-02 52 views
0

我有接口IPet,在另一個項目中,我有類Dog,它繼承自IPet
Dog我有方法Bark()但不在IPet
在項目IPet我也有PetSimulation類,其中我有一個IPet的實例。
現在我想讓這樣的事情:調用接口上的子類的方法,而不實現那裏的方法

IPet myDog = new IPet("Rex"); 
myDog.Bark(); 

IPet沒有方法Bark(),並應保持下去,因爲其他類,如CatHorse也從IPet繼承,但沒有方法Bark要麼。
此外,我不能做這樣的事情:

Dog myDog = new Dog("Rex"); 

因爲Dog是另一個項目。

有沒有什麼辦法讓我通過接口IPet調用子類Dog的方法Bark而不實現那裏的方法?

+0

你可以在接口上添加一個新的'Speak()'方法嗎? –

+0

@DanPichelman不,界面必須保持不變,就像現在一樣。 –

回答

1

你不能。但是你可以用方法Bark製作接口IDog,它可以繼承IPet

public interface IPet 
{ 

} 

public interface IDog : IPet 
{ 
    void Bark();  
} 

public class Dog : IDog 
{ 
    public void Bark() 
    { 
     Console.WriteLine("Wouff!");  
    } 
} 
+0

所以這會導致你能夠調用Bark的方法。但是如果沒有引用包含實際實現的項目/程序集的引用,您仍然無法在項目/程序集中創建IDog對象 - 這是從IDog派生的類。該接口沒有「代碼體」,它是一個合同,它只是定義了什麼行爲可用,而不是如何執行。 – mortb

0

您將需要以投myDog以狗來,只有那些類有訪問方法:

IPet myDog = new IPet("Rex"); 
((Dog)myDog).Bark(); 

如果在接口上,那麼將需要實現它的所有類都實現樹皮。

您可以通過添加對Dog項目的引用來訪問Dog嗎?

+0

否,因爲_Dog_的項目是主項目並且已經引用了_IPet_項目。所以我不能添加一個參考... –

2

簡短的回答:第

稍長的答案:

您可以測試IPet,看它是否是一個Dog,像這樣:

Dog dog = myDog as Dog; 
if (dog != null) 
{ 
    dog.Bark(); 
} 

請注意,你不能直接在問題中創建一個界面,除了very rare circumstances

+0

我看到...這對我不起作用,因爲那時我不能訪問狗,只能訪問IPet。隨着實現:原始代碼更長更復雜。我想盡可能簡單。 –

0

如果你真的無法訪問狗類和.NET正在4+你可以嘗試

dynamic dog = new ... 
dog.Bark() 
相關問題