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

c#从抽象泛型类继承的抽象泛型类,c#,generics,inheritance,C#,Generics,Inheritance,我试图创建一个从另一个抽象泛型类继承的抽象泛型类 这是我到目前为止所拥有的 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

我试图创建一个从另一个抽象泛型类继承的抽象泛型类

这是我到目前为止所拥有的

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
    }
}
公共抽象类基类{
公共长Id{get;private set;}
公共基类(长id){
这个.Id=Id;
}
}
公共抽象类基类:基类,其中T:BaseClass{
受保护基类(长id)
:base(id){
}
公共静态无法获取(长id){
T项;
返回TryGet(id,out item)?item:默认值(T);
}
公共静态bool TryGet(长id,out T项){
item=null;//这是我调用缓存的地方,但是对于这个例子,我已经删除了缓存,所以它将被编译
如果(item!=null){return true;}
否则{
//调用TryGetFallback方法
返回false;
}
}
受保护的抽象T TryGetFallback(长id);
}
公共抽象类DerivedClass:基类{
公共字符串名称{get;private set;}
public-DerivedClass(长id,字符串名)
:base(id){
this.Name=Name;
}
}
公共类DerivedDerivedClass:DerivedClass{
受保护的覆盖DeriveDerivedClass TryGetFallback(长id){
//处理“尝试获取”回退
}
}

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

首先,您需要修复
基类实现,使其不具有递归类型约束

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

现在,如果您编译它,它将警告您,
'DerivedDerivedClass'不实现继承的抽象成员'BaseClass.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();
    }
}
公共抽象类基类{
公共长Id{get;private set;}
公共基类(长id){
这个.Id=Id;
}
}
公共抽象类基类:基类,其中T:BaseClass,new(){
受保护的基类(长id):基(id){}
公共静态无法获取(长id){
T项;
返回TryGet(id,out item)?item:默认值(T);
}
公共静态bool TryGet(长id,out T项){
item=null;//在此处尝试从缓存获取项
如果(item!=null){return true;}
否则{
T obj=新的T();
项目=目标TryGetFallback(id);
退货项目!=空;
}
}
受保护的抽象T TryGetFallback(长id);
}
公共抽象类DerivedClass:基类,其中T:DerivedClass,new(){
公共字符串名称{get;private set;}
public-DerivedClass():基(0){}
public-DerivedClass(长id,字符串名)
:base(id){
this.Name=Name;
}
受保护的抽象覆盖T TryGetFallback(长id);
}
公共类DerivedDerivedClass:DerivedClass{
公共派生类(){
}
受保护的覆盖DeriveDerivedClass TryGetFallback(长id){
抛出新的NotImplementedException();
}
}

DerivedDerivedClass继承自从基类继承的DerivedClass继承的DerivedClass。您的链中没有基类,因此,您的方法不在链中。
BaseClass
没有在任何地方使用!另外,是否确实希望
BaseClass
的类型约束为
BaseClass
,似乎有点。。。递归的!嗨,大卫,是的,我意识到了这一点,但我不知道如何让基类进入链条。有什么想法吗?感谢在
BaseClass
中的递归表示
T
必须是
BaseClass
,这意味着
T
BaseClass
。。。。一路上都是乌龟!谢谢大卫,我在“DerivedClass”上遇到一个编译器错误:“DerivedClass”必须是带有公共无参数构造函数的非抽象类型,才能在泛型类型或方法“BaseClass”中用作参数“T”。我在DerivedClass中确实有一个空构造函数听起来你的类层次结构有点乱。你有没有碰巧
DerivedClass
继承自
BaseClass
?如果是这样,就不要这样做。如果我不让DerivedClass从基类继承,那么基类方法TryGetFallback就不会由DerivedDerivedClass实现。实际上,我要做的是在我的基类上有一个TryGet方法(我的代码段中没有包含)它尝试从缓存中获取对象,如果它不在缓存中,则调用方法TryGetFallback,我想在DerivedDerived类上处理该方法创建一个丢弃对象的模式
T obj=new T()
只允许您调用实例方法,这清楚地表明存在黑客行为。
TryGetFallback
方法不属于
T
,它属于一个相关但独立的类,通常称为“工厂”()。
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();
    }
}