如何处理派生 类 与列表中覆盖的泛型类型?

How to handle Derived Classes with overridden Generic Types in Lists?

我想创建一个资源管理器,其中包含自定义类型的派生资源 class,例如 Texture1D、Texture2D 等。因此我想覆盖父类的通用类型,因此我能够 return 资源数据而不是从对象中转换它。 (此解决方案也可以使用结构)。

如果上面的文字有点不清楚,请参阅此方法:

我创建了一个界面IResource。 (1)
然后是实现此接口的抽象class。 (2)
最后是我的自定义资源,它源自 Resource<T>。 (3)

//1
public interface IResource : IDisposable

//2
// This class returns Data as T
public abstract class Resource<T> : IResource 

//3
// This class returns Data as GLEXTexture2D
public class Texture2DResource : Resource<GLEXTexture2D>

基本上,我有一个带有 IResource 列表的 ResourceManager,它可以像这样添加资源:

Texture2DResource resource = new Texture2DResource("a path", ResouceThreadAccess.LOCAL);
resourceManager.RegisterResource(resource);

这是一个可以接受的设计决策吗?在我看来,通用覆盖代码在创建新资源时看起来有点混乱。有没有更好的办法解决这个三重继承?

我经常使用上面的模式(即:接口,具有抽象基础 class,以及实际的 class 本身)。要回答它是否是可以接受的设计决策,这取决于您想要实现的目标(尽管通常它是一个好的设计)...

使用 resourceManager,您可以遍历它们并调用接口中的方法(您可以在其中覆盖 child object 中的不同实现)。这样,您甚至不必担心从 'object'.

投射

但是,如果你有很多 child-specific class,这意味着你需要从 resourceManager 中识别出具体的 child class -- 那么 'generic' 自然和抽象基础 class 可能没有多大帮助。