2011-08-31 56 views
0

我有以下情形問題的抽象類,接口,集裝箱和方法

我有一個接口

public interface ImyInterface 
{ 
    void myInterfaceMethod(string param); 
} 

我有一個抽象類

public abstract class myAbstractClass 
{ 
    public myAbstractClass() 
    { 
     //something valid for each inherited class 
    } 

    public void myAbstractMethod<T>(T param) 
    { 
     //something with T param 
    } 
} 

我ve一類從myAbstractClass繼承並實現ImyInterface

public class myClass : myAbstractClass, ImyInterface 
{ 
    public myClass():base() 
    {} 

    public void ThisMethodWillNeverCall() 
    { 
     // nothing to do 
    }      
} 

最後,我有一個類,我將創建一個ImyInterface對象。在這一點上,我會叫myAbstractMethod,但是......

public class myFinalClass 
{ 
    public void myFinalMethod() 
    { 
     ImyInterface myObj = _myContainer<ImyInterface>(); 

     myObj.??? 

    } 
} 

顯然沒有這種方法,因爲它沒有宣佈進入界面。 我的解決方案如下

public interface ImyInterface 
{ 
    void myInterfaceMethod(string param); 
    void myFakeMethod<T>(T param); 
} 

public class myClass : myAbstractClass, ImyInterface 
{ 
    public myClass():base() 
    {} 

    public void ThisMethodWillNeverCall() 
    { 
     // nothing to do 
    } 

    //--- a fake method 
    public void myFakeMethod<T>(T param) 
    { 
     base.myAbstractMethod<T>(param); 
    }      
} 

還有沒有其他的解決方案比我好?

謝謝!

+1

您爲什麼認爲這是一個問題?如果方法是使用接口的代碼所要求的,它應該是接口的一部分。 – Jason

+1

如果你正在使用接口,那麼顯然這些方法需要在接口上聲明。 – dlev

+0

拋棄接口,使用抽象類。 – Will

回答

3

首先,你的命名約定是一團糟。請閱讀微軟已經提供的guidelines

根據你的例子,很難說出你想要達到什麼目的。

回到你的問題:

您應該只訪問一個接口與接口工作。不要試圖用類/接口來創造任何魔術,讓它們一起工作。這通常意味着該類不應嘗試實現該接口。

你最好創建一個新的接口,它具有你想要的功能,並讓你的類同時實現。

+0

這是一個例子,我儘量寫得儘可能簡單。謝謝,我會根據你的建議創建一個新的界面。 – Faber