c#从抽象泛型类继承的抽象泛型类

本文关键字:泛型类 抽象 继承 | 更新日期: 2023-09-27 18:26:12

我正在尝试创建一个从另一个抽象泛型类继承的抽象泛型类。

以下是我目前拥有的

public abstract class BaseClass {
    public long Id { get; private set; }
    public BaseClass(long id) {
        this.Id = id;
    }
}
public abstract class BaseClass<T> : BaseClass where T : BaseClass {
    protected BaseClass(long id)
        : base(id) {
    }
    public static T Get(long id) {
        T item;
        return TryGet(id, out item) ? item : default(T);
    }
    public static bool TryGet(long id, out T item) {
        item = null; // This is where I call the cache but for this example I've removed so it will compile
        if (item != null) { return true; }
        else {
            // Call TryGetFallback method
            return false;
        }
    }
    protected abstract T TryGetFallback(long id);
}

public abstract class DerivedClass : BaseClass<DerivedClass> {
    public String Name { get; private set; }
    public DerivedClass(long id, String name)
        : base(id) {
        this.Name = name;
    }
}
public class DerivedDerivedClass : DerivedClass {
    protected override DerivedDerivedClass TryGetFallback(long id) {
        // Handle the try get fallback
    }
}

DerivedDerivedClass上的TryGetFallback方法导致编译器错误。

c#从抽象泛型类继承的抽象泛型类

首先需要修复BaseClass<T>实现,使其不具有递归类型约束。

public abstract class BaseClass<T> : BaseClass where T : new() {
    //snip
}

然后您可以在派生类中使用它,例如,我将使它使用int作为泛型类型参数:

public abstract class DerivedClass : BaseClass<int> {
    //snip
}

现在,如果您进行编译,它将警告您'DerivedDerivedClass' does not implement inherited abstract member 'BaseClass<int>.TryGetFallback(long)'

感谢@DavidG的提示,它帮助我解决了以下代码的问题

public abstract class BaseClass {
    public long Id { get; private set; }
    public BaseClass(long id) {
        this.Id = id;
    }
}
public abstract class BaseClass<T> : BaseClass where T : BaseClass<T>, new() {
    protected BaseClass(long id) : base(id) { }
    public static T Get(long id) {
        T item;
        return TryGet(id, out item) ? item : default(T);
    }
    public static bool TryGet(long id, out T item) {
        item = null; // Try to get item from cache here
        if (item != null) { return true; }
        else {
            T obj = new T();
            item = obj.TryGetFallback(id);
            return item != null;
        }
    }
    protected abstract T TryGetFallback(long id);
}
public abstract class DerivedClass<T> : BaseClass<T> where T : DerivedClass<T>, new() {
    public String Name { get; private set; }
    public DerivedClass() : base(0) {  }
    public DerivedClass(long id, String name)
        : base(id) {
        this.Name = name;
    }
    protected abstract override T TryGetFallback(long id);
}
public class DerivedDerivedClass : DerivedClass<DerivedDerivedClass> {
    public DerivedDerivedClass() {
    }
    protected override DerivedDerivedClass TryGetFallback(long id) {
        throw new NotImplementedException();
    }
}