通过几个派生类传递类型参数,以便在泛型静态构造函数中使用
本文关键字:泛型 静态 构造函数 类型参数 几个 派生 | 更新日期: 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)
Instance
是A<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; }
}