通过几个派生类传递类型参数,以便在泛型静态构造函数中使用

本文关键字:泛型 静态 构造函数 类型参数 几个 派生 | 更新日期: 2023-09-27 17:50:12

我有一些通用的模板为多个或对象池。

public class A<TC> where TC : class, new()
{
    protected static ConcurrentDictionary<object, TC> _instances = new ConcurrentDictionary<object, TC>();
    public static TC Instance(object key)
    {
        return _instances.GetOrAdd(key, k => new TC());
    }
}
// One level inheritance works as expected    
public class B : A<B> 
{
    public virtual int Demo() { return 1; }
}
// Class C is example of what I want    
// How to override method from B, pass C to A and use it in GetInstance?
public class C : B<C>
{
    public override int Demo() { return 2; }
}

问题:我想要类C重写B的方法,我怎么能通过子类链传递类型参数"C"来使用方法实例()从A,这是可能的吗?

我试图修改B,但似乎它使它泛型,不允许实例化B:

public class B<TC> : A<TC> where TC : class, new()
{
    public virtual int Demo() { return 1; }
}

:这个想法是通用的静态构造函数,然后从它派生类内存与内存映射文件,但这类只能读写字节序列,因此,我创建了类MemoryStructs源于记忆和这门课能读和写的整个结构,当然,我可以把所有这些方法到内存但我想将它们在逻辑上可能是有用的,因此,我有这样的继承链:BaseClass> Memory> MemoryStructs

Memory和MemoryStructs类有OpenMemory和closemmemory方法,我不愿意为它们中的每一个复制这些方法,因此我需要:

  • 继承MemoryStructs从内存,因为我现在正在尝试或
  • 将所有方法放入内存类中,命名为ReadBytes (Memory)和ReadStructs (MemoryStructs)

通过几个派生类传递类型参数,以便在泛型静态构造函数中使用

InstanceA<TC>的静态方法,因此在B中甚至不存在可以重写的Instance方法(即使可以,TC类型参数届时将绑定到B,因此返回C的方法将是不同的方法)。

所以你调用Instance的方式是使用A<TC>.Instance(key),其中TC是一个实际类型。例如:

B objectB = A<B>.Instance(key)
C objectC = A<C>.Instance(key)
注意,每个类型参数TC的并发字典都是单独的,因此A<B>A<C>共享同一个字典;

也许你需要另一个类链?

public class B1<T> : A<B1<T>> 
{
    public virtual int Demo() { return 1; }
}
public class B2 : B1<B2>
{
    // Something that C does not do
}
public class C : B1<C>
{
   public override int Demo() { return 2; }
}
编辑:

似乎你想继承B的一些功能,并在C中传递类型参数给它,同时你想将B定义为非泛型类,这是不可能的,B必须是非泛型的,你没有C:了:

public class B : A<B>
{
    public virtual int Demo() { return 1; }
}
public class C : B
{
   public override int Demo() { return 2; }
}

或者它必须是泛型的,这样你就不能把B作为类型参数传递给a:

public class B<T> : A<T>
{
    public virtual int Demo() { return 1; }
}
public class C : B<T>
{
   public override int Demo() { return 2; }
}

或者你可以选择使用复合模式并在C中创建B的实例,以便你可以在C中使用它的功能:

public class B : A<B>
{
    public virtual int Demo() { return 1; }
}
public class C : A<C>
{
   private B b = new B();
   public override int Demo() {
      // Maybe use b here
      return 2;
   }
}

@David Amo绝对正确。也许这就是你想要的?

public abstract class A<TC> where TC : class, new()
{
    protected static ConcurrentDictionary<object, TC> _instances = 
        new ConcurrentDictionary<object, TC>();
    public static TC Instance(object key)
    {
        return _instances.GetOrAdd(key, k => new TC());
    }
    public abstract int Demo();
}
public class B : A<B>
{
    public override int Demo() { return 1; }
}
public class C : A<C>
{
    public override int Demo() { return 2; }
}