2017-06-15 87 views
2

這可能是一個關於基礎設計的問題。聲明對象類型的接口

我想對神祕對象執行操作,只要它實現我的接口IMyInterface即可。而且我想由interace定義爲返回神祕對象,因此實例的方法之一...

IMyInterface 
    { 
    object GetInstance(); 
    } 

public class MysteryObject : IMYInterface 
} 
    public object GetInstance() 
    { 
     MysteryObject instance = new MysteryObject(); 
     return instance; 
    } 
} 

但這會導致不必要的「對象」類型以及與這些相關的開銷。 C#特別使用泛型來殺死這個開銷。這將是理想的做這樣的事情:

IMyInterface 
    { 
    T GetInstance<T>(); 
    } 

public class MysteryObject : IMYInterface 
} 
    public MysteryObject GetInstance<MysteryObject>() 
    { 
     MysteryObject instance = new MysteryObject(); 
     return instance; 
    } 
} 

我知道這第二個例子不起作用。我知道語法是錯誤的。 ..但我想知道是否有更好的方法來要求實現IMyInterface的對象返回它自己類型的實例。

我的例子有點不可思議,但我認爲大多數人會理解情緒。奇怪的是,我發現很少有這方面的例子或問題。

+0

,幾乎鑄造引用類型爲對象來回 –

回答

4

你可以只是把返回類型IMyInterface

public interface IMyInterface 
{ 
    IMyInterface GetInstance(); 
} 

public class MysteryObject : IMyInterface 
{ 
    public IMyInterface GetInstance() 
    { 
     MysteryObject instance = new MysteryObject(); 
     return instance; 
    } 
} 

或者泛型:

public interface IMyInterface<T> 
{ 
    T GetInstance(); 
} 

public class MysteryObject : IMyInterface<MysteryObject> 
{ 
    public MysteryObject GetInstance() 
    { 
     MysteryObject instance = new MysteryObject(); 
     return instance; 
    } 
} 

如果你想在一般的參數爲類型IMyInterface的添加約束這樣的:

public interface IMyInterface<T> 
    where T : IMyInterface<T> 
{ 
    T GetInstance(); 
} 

更新

下面是一些示例用法,看看這兩個版本之間的區別是什麼:

  1. 返回接口IMyInterface

    IMyInterface a = new MysteryObject().GetInstance(); // valid 
    MysteryObject b = new MysteryObject().GetInstance();// invalid 
    MysteryObject b = (MysteryObject)new MysteryObject().GetInstance(); // valid 
    
  2. 從接口返回的泛型類型參數:

    IMyInterface<MysteryObject> a = new MysteryObject().GetInstance(); //valid 
    MysteryObject b = new MysteryObject().GetInstance(); //valid 
    
+0

全面的開銷。很好的答案。返回IMyInterface或Generic之間的成本有什麼特別的區別? –

+0

通用版本將直接轉換爲指定的泛型類型參數。例如,如果你要返回接口,你必須手動將其轉換爲「MysteryObject」。 – Deadzone

+0

@JamieMarshall我在答案中包含了一些例子。 – Deadzone

2

差不多有它。你需要讓整個界面通用:

IMyInterface<T> 
    { 
    T GetInstance(); 
    } 

public class MysteryObject : IMYInterface<MysteryObject> 
} 
    public MysteryObject GetInstance() 
    { 
     MysteryObject instance = new MysteryObject(); 
     return instance; 
    } 
}