gpt4 book ai didi

c# - 使用泛型和支持子类跟踪实例

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:04 24 4
gpt4 key购买 nike

我定义了下面的泛型类

public class ManagedClass<T> where T : ManagedClass<T>
{
static ManagedClass()
{
Manager = new ObjectManager<T>();
}
public static ObjectManager<T> Manager { get; protected set; }

public ManagedClass()
{
Manager.Add( (T)this );
}
}

我的想法是我可以这样使用它:

class Product : ManagedClass<Product> {}

现在我可以像这样创建第 7 个产品:

Product.Manager.GetById(7).DoSomething();

如果我尝试使用派生类,就会出现问题:

class ExtendedProduct : Product {}

现在 ExtendedProduct.Manager 有一个“产品”列表,如果我想使用我添加到 ExtendedProduct (DoSomethingElse) 的新功能,我必须像这样转换我得到的对象:

((ExtendedProduct)ExtendedProduct.Manager.GetById(7)).DoSomethingElse();

这有点难看,为此使用泛型的全部意义在于避免转换。我想我可以向派生类添加一个静态构造函数以设置 Manager = new ObjectManager() 并在派生类构造函数中添加一个 new Manager.addObject( this ),但似乎应该有一些更好的方法来使用泛型。有什么建议吗?

最佳答案

问题是 ExtendedProduct.ManagerProduct.Manager 相同;管理器对象不能根据从何处访问而有所不同。

我能想到的几种可能性:

  1. 隐藏 GetById 中的类型转换通过使其通用的方法: Product.Manager.GetById<ExtendedProduct>(7).DoSomethingElse();

  2. 使用一个 ObjectManager每个子类的实例,如果需要则私下连接它们

选项 1 让我想起了 NHibernate 的 ICriteria界面。它实际上与类型转换相同,但更难意外中断。

关于c# - 使用泛型和支持子类跟踪实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1843454/

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