在接口中创建通用属性

时间:2013-07-24 06:51:39

标签: c# asp.net .net

我想用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
}

谢谢!

5 个答案:

答案 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作为类的默认泛型类型声明