6

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

谢谢!

4

5 回答 5

6

按照其他答案的建议,将接口更改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();
    }

    ...
}
于 2013-07-24T07:08:49.860 回答
5

你快到了,只需使用定义你的界面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;
    }
}
于 2013-07-24T06:58:22.830 回答
3

这应该这样做:

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

顺便说一句:GetId() 是一个方法。

一个属性看起来像这样:

public interface INode<T> : IEquatable<INode<T>>
{
    T Id
    {
        get;
        set;
    }
}
于 2013-07-24T06:55:46.637 回答
1

您的INode界面实际上可以INode<T>在 T 是 int、string 的地方吗?那么你的属性可以是 T 类型。

如果您需要继承,那么您将拥有INode<T>INode接口,其中INode<T>具有特定于类型的内容并INode具有非特定于类型的内容(以及用于 Id 检索的基于对象的属性或方法)

于 2013-07-24T06:57:26.560 回答
0

He![re is solution for this case Use default int type where you need else use PersonNode T as generic type and WorkItemNode use int 而不是 T 作为类的默认泛型类型声明

于 2013-07-24T07:25:05.760 回答