【发布时间】:2018-07-09 07:01:20
【问题描述】:
我正在研究 2 个类似于下面的层次结构 -
层次结构 1:
public class Content
{
}
public class Text : Content
{
}
public class Image : Content
{
}
层次结构 2:
public class ContentProperties
{
}
public class TextProperties : ContentProperties
{
}
public class ImageProperties : ContentProperties
{
}
现在我想实现 2 个行为:
首先,我想要 ContentProperties 中的一个属性,以便我可以将它概括为 Content 的所有子类。然后,我可以根据所需的子类型在子类中独立分配它们。
类似的东西。
public class Content
{
public ContentProperties Properties {get;set;}
}
public class Text : Content
{
public Text()
{
this.Properties = new TextProperties();
}
}
...对于其他子类,依此类推。
第二个是,我想限制一种类型的子类只分配对应类型的属性。
例如
Text text = new Text();
text.Properties = new ImageProperties(); //This should give an error - should not be possible.
我可以通过将各个属性保留在各个子类中来实现第二种行为,但这与我的第一种行为相矛盾。另外,我不想通过创建两个单独的对象来保留冗余数据。我可以使用签入属性设置器或使用设置器方法来实现类似的功能,但是,这不是确切的行为。
谁能建议我如何实现上述行为?
如果标题措辞不正确,如有任何误解,敬请见谅。
【问题讨论】:
-
您可以将 Properties 类型设为内容类的泛型类型,然后将您的类型基于泛型参数
-
@Icepickle 这是解决问题的好方法,但是如果我有一个可能是文本或图像的内容列表并且我只想更新这些对象的 ContentProperties 成员,这不会导致问题.
-
不是真的,当你循环时你总是有
if (item is Text textContentItem)结构,所以你总是会确切地知道你会得到什么;) -
@Icepickle,没错。如果我错了,请纠正我,但您的实现不会删除 ContentProperties 层次结构的全部目的吗?
-
我不完全理解您删除目的是什么意思,您的目的不是以类型安全的方式在基类上实现泛型成员吗?在某些时候,您必须决定如何处理它们。我认为我当前想法的最大问题是我有一个属性设置器,我会选择一个设置一次的自动属性。但是,如果目前以建议的方式执行此操作似乎对您不利,那么您需要提供更多信息究竟是什么在困扰您? :)
标签: c# .net inheritance