2013-07-24 57 views
3

我想用方法GetId()創建一個接口。根據子項目,它可以是一個int,字符串或其他。這就是爲什麼我嘗試使用返回類型對象(但後來我無法在子項目中指定類型)並想嘗試使用泛型。在界面中創建通用屬性

我該怎麼做?

我已經有了:

public interface INode : IEquatable<INode> 
{ 
    object GetId(); 
} 

public class PersonNode : INode 
{ 
    object GetId(); //can be int, string or something else 
} 

public class WorkItemNode : INode 
{ 
    int GetId(); //is always int 
} 

謝謝!

+1

你看過了本頁右側發佈的任何'Related'鏈接..? – MethodMan

+0

請解釋一下PersonNode的id可以是int,string還是somethign。 – Maarten

+0

@DJKRAZE是的。但它沒有透露我從傑普斯蒂格尼爾森那裏得到的解決方案。 – casaout

回答

3

要麼改變INode接口到一個通用的類型interface INode<out T>通過其他的答案的建議。

或者,如果你不希望出現這種情況,明確實現您的非通用接口,並提供一個類型安全的公共方法,以及:

public class WorkItemNode : INode 
{ 
    public int GetId() //is always int 
    { 
     ... 
     // return the int 
    } 

    object INode.GetId() //explicit implementation 
    { 
     return GetId(); 
    } 

    ... 
} 
+0

第二種方法做到了。非常感謝你的提示! – casaout

4

這應該這樣做:

public interface INode<T> : IEquatable<INode<T>> 
{ 
    T GetId(); 
} 

BTW:GETID()是一個方法。

一個屬性是這樣的:

public interface INode<T> : IEquatable<INode<T>> 
{ 
    T Id 
    { 
     get; 
     set; 
    } 
} 
+0

非常感謝! Ups,我無意中編寫了屬性,但編寫了一個方法;) – casaout

+1

當然,也可以使用只有'get'訪問器的屬性,不能使用'set'。 –

1

難道你INode接口實際上是INode<T>其中T爲int,字符串,不管? 然後你的財產的類型可以是T的

如果你需要繼承,那麼你必須INode<T>INode接口,其中INode<T>有特定類型的東西,INode有非A型具體的東西(和基於對象的屬性或Id的檢索方法)

6

就快,只是定義使用INode<T>

public interface INode<T> : IEquatable<INode<T>> 
{ 
    T GetId(); 
} 

public class PersonNode : INode<string> 
{ 
    public bool Equals(INode<string> other) 
    { 
     throw new NotImplementedException(); 
    } 

    public string GetId() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class WorkItemNode : INode<int> 
{ 
    public int GetId() 
    { 
     throw new NotImplementedException(); 
    } 

    public bool Equals(INode<int> other) 
    { 
     throw new NotImplementedException(); 
    } 
} 

你可以甚至使用你的界面與接口

public class OtherItemNode : INode<object> 
{ 
    public bool Equals(INode<object> other) 
    { 
     throw new NotImplementedException(); 
    } 

    public int Id { get; set; } 

    public object GetId() 
    { 
     return Id; 
    } 
} 
+0

謝謝您的評論! – casaout

0

他[再是這種情況下使用默認INT解決方案鍵入你需要的其他地方使用PersonNode T作爲泛型類型,WorkItemNode使用int而不是T作爲類的默認泛型類型聲明