2013-07-24 34 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作为类的默认泛型类型声明