我想用GetId()方法创建一个接口。根据子项,它可以是int,string或其他东西。这就是为什么我尝试使用返回类型对象(但后来我不能在子项中指定类型)并想尝试使用泛型。
我该怎么做?
我已经拥有的东西:
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
}
谢谢!
答案 0 :(得分: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();
}
}
你可以甚至使用带有接口的object
public class OtherItemNode : INode<object>
{
public bool Equals(INode<object> other)
{
throw new NotImplementedException();
}
public int Id { get; set; }
public object GetId()
{
return Id;
}
}
答案 1 :(得分:4)
这应该做:
public interface INode<T> : IEquatable<INode<T>>
{
T GetId();
}
BTW:GetId()是一种方法。
属性看起来像这样:
public interface INode<T> : IEquatable<INode<T>>
{
T Id
{
get;
set;
}
}
答案 2 :(得分:4)
根据其他答案的建议,将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();
}
...
}
答案 3 :(得分:1)
你的INode
接口实际上可能是INode<T>
,其中T是int,string,等等?
那么你的财产可以是T型。
如果您需要继承,那么您有INode<T>
和INode
个接口,其中INode<T>
具有特定于类型的内容,而INode
具有非类型特定的内容(以及用于Id检索的基于对象的属性或方法
答案 4 :(得分:0)
他![重新是这种情况的解决方案使用默认的int类型,你需要使用PersonNode T作为泛型类型而WorkItemNode使用int而不是T作为类的默认泛型类型声明