如何处理派生 类 与列表中覆盖的泛型类型?
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 可能没有多大帮助。
我想创建一个资源管理器,其中包含自定义类型的派生资源 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 可能没有多大帮助。