2014-09-24 80 views
3

好吧,這可能是一個新手問題。所以道歉。 比方說我有等的方法類:確保只有實現某個接口的類才能調用方法? C#?

public class A 
{ 
    public void DoSomething(long x) 
    { 
    } 
} 

現在我要確保調用DoSomething的任何對象或類()必須實現一定的接口一樣ISomethingInterface?

在C#中可以這樣做嗎? 感謝

+6

小心解釋爲什麼? – 2014-09-24 14:52:37

+8

爲什麼不反轉它並使該方法成爲界面合同的一部分。該方法可能需要A類型的參數。 – 2014-09-24 14:52:40

+3

聽起來像[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。如果你能說出你想要解決什麼問題會更好? – 2014-09-24 14:55:21

回答

2

的問題是那樣的陌生,因爲你試圖實現類似的接口方案的東西,但那種上攻下。

如果你真的想只實現某個接口的類能夠調用一些特定的方法我會執行它的擴展方法:

public static void DoSomething(this IFoo foo, long x) 
{ 
    .... 
} 

現在,你只能通過一個IFoo類型的對象調用DoSomething(long x)。有關更多信息,請參閱extension methods

當然的等效解決方案,但不是那麼方便或優雅是簡單地實現,像這樣一個靜態方法:

public static void DoSomething(IFoo foo, long x) { ... } 

要切換調用僅IFoo對象DoSomething路過一個IFoo對象作爲參數。擴展方法本質上是該解決方案的語法糖。

但是,除非您無權訪問IFoo的實施(第三方代碼)或更改界面是您無法承受的重大更改,否則這種情況確實沒有意義。如果你有訪問權限或可以承受中斷,那麼只需使界面成爲DoSomething的一部分。這樣所有的IFoo對象將有一個DoSomething方法。

不知道我是否正確理解你的問題。

0
public class A : IA 
{ 
     public void DoSomething(long x) 
     { 
      } 
} 

public interface IA 
{ 
    void DoSomething(long x) 
} 


/*Some method somewhere*/ 
public void DoThisThing() 
{ 
    IA a = new A(); 

    a.DoSomething(10); 
} 

你是那種對行權,但它的作品倒過來。界面告訴你你可以做什麼,它就像一個合同。

現在你可以執行你在其他類確保你只能叫DoSomething

public class B : IA 
{ 
    public void DoSomething(long x) 
    { 
     // B's custom implementation 
    } 

    public void IWantSomethingElse(string s) 
    { 
     // this is only class specific and cannot be called from the interface 
    } 
} 

/* Some method somewhere */ 
public void DoThisThing() 
{ 
    IA a = new B(); 

    a.DoSomething(2); 

    // here there is no way to call IWantSomethingElse because the its not on the interface 
} 
0

如果你真的要執行,其中用戶必須實現界面B1,如果他們也有一個場景,然後你合同可以簡單地標記一個接口來重新實現另一個接口。見MSDN - Interfaces

public interface A 
{ 
    void a(); 
} 

public interface B : A 
{ 
    void b(); 
} 

public class Foo: B 
{ 
    public void a() 
    { 
    } 


    public void b() 
    { 
    } 
} 

如果他們不執行這兩種方法,那麼這將拋出一個編譯時錯誤。

0

你可能想使用,而不是實現一個接口的功能的抽象類:

public abstract class MyAbstractClass 
{ 
    //This one HAS to be defined in the inheritor class, like an interface 
    public abstract void DoSomeOtherThing(); 

    //This is your function that can only be called by objects that inherit from this class. 
    protected void DoSomething() 
    { 
     //use your protected method here 
    } 
} 

public class MyClass : MyAbstractClass 
{ 
    public MyClass() 
    { 
     DoSomething(); 
    } 

    public override void DoSomeOtherThing() 
    { 

    } 
} 
+0

我喜歡這種方法,我認爲在這種情況下,它更接近OP要求的內容。我個人會這樣做。 – 2014-09-24 15:20:00

相關問題