2009-01-22 43 views
2

我經常發現需要做的東西沿着這些路線定義類型:如何處理沒有被允許在C#中的接口

public class OperationResult 
{ 
    bool succes; 
    SomeOtherObject someobject; 
} 


public interface ICanDoSomethingWeird 
{ 
    OperationResult DoMyThing(); 
} 

凡OperationResult真的是屬於ICanDoSomethingWeird接口的類。我覺得非常煩人,我不能把它放在界面的命名空間中。 我想知道其他人如何處理這個問題。你只是把它粘在全局命名空間中嗎?或者從接口所在的命名空間起只有一個命名空間?

我目前的做法是做重命名OperationResult類ICanDoSomethingWeird_OperationResult,但我不通過是多麼可愛非常深刻的印象:)

人有更好的解決辦法?

回答

10

如果OperationResult是僅由ICanDoSomethingWeirdICanDoSomethingWeird的客戶端使用的類型,則它與ICanDoSomethingWeird屬於相同的「上下文」。也就是說,它屬於相同命名空間ICanDoSomethingWeird

namespace MyNamespace 
{ 
    public class OperationResult {} 

    public interface ICanDoSomethingWeird 
    { 
     OperationResult DoMyThing(); 
    } 
} 

想想客戶端代碼。你會喜歡這樣的:

using MyNamespace; 

ICanDoSomethingWeird myWeirdThing = ...; 
ICanDoSomethingWeird.OperationResult result = myWeirdThing.DoMyThing(); 

或本:

using MyNamespace; 

ICanDoSomethingWeird myWeirdThing = ...; 
OperationResult result = myWeirdThing.DoMyThing(); 

後者更有意義,我,就是接口都在關注的唯一選擇。你不能在接口中聲明內部類型。並做注意general advice關於嵌套類型:

如果類型是 可能是 包含類型以外的引用不要使用嵌套的類型。

0

您可以將接口定義爲抽象類,然後定義公共內部類。

public interface ICanDoSomething 

public abstract class AbstractCanDoSomething 
{ 
    public class OperationResult 
    { 
      public bool SomeValue { get; set; } 
      public int SomeOherVAlue { get; set; } 
    } 

    public abstract OperationResult DoMyThing(); 
} 
+0

使用抽象的問題是,您不能僅僅選擇實現它,因爲您可能是一個接口。在代碼設計的早期階段,需要將其仔細包含在類heirarchy中。 – AnthonyWJones 2009-01-22 13:22:22

1

接口沒有定義任何實現。通過包含一個類,你的接口有效地包含了一些實現。嵌套類的目的是協助定義它的類實現。

不應該使用嵌套類,就好像該類具有與包含類一樣使用的優點。不應將類用作名稱空間的替代項來定義其他類。

如果一個接口定義了一些需要使用尚不存在的類的行爲,那麼在該接口所屬的同一個名稱空間中創建該類將是有意義的。

相關問題