用泛型覆盖抽象方法

时间:2013-10-21 14:14:12

标签: c# override abstract

我有一个像这样定义的抽象基类:

public abstract class MyBaseClass<T>

该类包含方法Get:

的定义
protected abstract MyBaseClass<T> Get(T id);

我使用MyBaseClass创建MyClass:

public class MyClass : MyBaseClass<string>

现在我必须实现Get,但不知道如何定义它:

public override MyClass Get(object id)

public override MyClass Get(string id)

在这两种情况下,我都必须提到stringT,我想避免使用它。

覆盖Get的正确方法是什么?

谢谢。

3 个答案:

答案 0 :(得分:2)

当您说明您正在实现的界面时,您在编写(string)时将通用参数指定为: MyBaseClass<string>,因此方式可用于实现Get方法是使用string代替T的所有值。如果您希望类的用户能够使用其他类型,那么您还需要使实现类通用:

public class MyClass<T> : MyBaseClass<T>
{
    protected override MyBaseClass<T> Get(T id)
    {
        throw new NotImplementedException();
    }
}

答案 1 :(得分:1)

public abstract class MyBaseClass<T>
{
    protected abstract MyBaseClass<T> Get(T id);
}

public class MyClass : MyBaseClass<string>
{
    protected override MyBaseClass<string> Get(string id)
    {
        return FindById(id);//implement your logic
    }
}

答案 2 :(得分:0)

按如下方式实现抽象类:

public abstract class  MyBaseClass<T>
{
    protected abstract MyBaseClass<T> Get(T id);

    protected abstract MyBaseClass<T> Get(string id);
}

扩展课程:

class Class1 : MyBaseClass<Object>
{
    protected override MyBaseClass<object> Get(object id)
    {
        return (MyBaseClass<object>) id;
    }

    protected override MyBaseClass<object> Get(string id)
    {
        return FindMyBaseClass(id)
    }
}