使用泛型将类型信息传递给超类

本文关键字:超类 信息 类型 泛型 | 更新日期: 2024-11-06 23:00:22

我正在编写的代码,该代码具有一个超类,该超类封装了一个特定于每个特定子类的对象,例如下面是子类类型与它封装的类类型的示例关系。所有封装类也对它们封装的类进行了隐式强制转换。(非抽象的)。

Item => Model.Item
Box => Model.Box

与其使用非类型安全object类型,我觉得我可以使用泛型来获得类型安全性和优雅性。

public abstract class Entity<T> where T: class
{
    protected T DataObject;
}
public class Item : Entity<Model.Item>
{
    // Can use this.DataObject and it is type Model.Item
}
public class Box : Entity<Model.Box>
{
    // Can use this.DataObject and it is type Model.Box
}

这种方法工作得很好,直到我想开始制作二级子类,所以我将Item的定义更改为(注意Model.AItem扩展Model.Item

public class Item<T> : Entity<T> where T : Model.Item
{
    // Can use this.DataObject and it is type Model.Item
}
public class AItem : Item<Model.AItem>
{
    // Can use this.DataObject and it is type Model.AItem
}

这对我来说有两个主要问题,一个是当我想引用二级对象作为我必须放入的抽象类时Item<Model.Item>我希望有一种方法可以隐含,因为从来没有这种情况不是真的。此外,它对抽象类的隐式强制转换造成了严重破坏,因为它们无法实例化。

没有什么是行不通的,我基本上是我想删除遗传参数,同时仍然保持拥有特定类型封装对象的能力。封装的对象实际上是一个 Linq to SQL 对象,周围的对象正在形成一种用于更改的缓冲区,同时实现其他功能并提供更直接的数据表示形式,因为它在应用程序中。我需要保留 LinqToSql 实体,这样我就可以在不重新发明轮子的情况下仍然使用 LinqToSql 来更新更改和管理插入/删除。我使用分部类来执行此操作,但与属于不同数据上下文的对象有太多的混淆。

编辑:完整故事

我有一个由不同类型的调查对象组成的调查评估。某些调查对象(如实际问题对象)由不同的其他对象组成。例如,块是一个具有项目库的调查对象,项目库由可以有许多不同类型的项目组成(当前表示为子类)。到目前为止,我一直直接使用 Linq to SQL enties 作为我的模型,并通过分部类进行了一些更改。Item's 有一个脚本,该脚本在调查中调用项目之前和之后执行。此脚本可以更改项的某些属性,但由于每当我根据 linq 的性质对它们进行更改时,我的 linq 类都是我的模型,它希望将这些更改保存到数据库中。

有没有人看到更好的做事方法?

使用泛型将类型信息传递给超类

请参阅有关协方差和逆变的信息。 你也许可以做一个interface IEntity<out T> where T : class { T DataObject { get; } },并让你的抽象类实现这一点,然后你可以隐式地进行这种转换:

IEntity<Model.AItem> a = //something
IEntity<Model.Item> b = a; //it works!

如果你不能使用协变接口来做到这一点,那么你就不能真正在逻辑上做你想做的事情,你应该尝试从其他角度找出一个解决方案。