gpt4 book ai didi

c# - 通过几个派生类传递类型参数以在通用静态构造函数中使用

转载 作者:行者123 更新时间:2023-11-30 20:43:37 25 4
gpt4 key购买 nike

我有一些用于 multiton 或对象池的通用模板。

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 的方法 Instance() 一起使用,是吗?有可能吗?

我试图修改 B 但似乎它使它变得通用并且不允许实例化 B :

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

更新:这个想法是拥有通用的静态构造函数,然后我从中派生出类 Memory 来处理内存映射文件,但是这个类只能读写字节序列进出,因此,我创建了从 Memory 派生的类 MemoryStructs,这个类可以读写整个结构,当然,我可以将所有这些方法放入 Memory 但我认为逻辑上拆分它们可能有用,因此,我有这样的继承链:基类 > 内存 > 内存结构

Memory 和 MemoryStructs 类有 OpenMemory 和 CloseMemory 方法,我不愿意为每个方法重复这些方法,因此我需要:

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

最佳答案

InstanceA<TC> 的静态方法所以甚至不存在 Instance B 中的方法您可以覆盖它(即使可以,到那时 TC 类型参数将绑定(bind)到 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>不要共享同一个词典;它们是具有不同静态成员的不同类型。

关于c# - 通过几个派生类传递类型参数以在通用静态构造函数中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com