【问题标题】:Differentiate between child classes from a parent class object?从父类对象中区分子类?
【发布时间】: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


【解决方案1】:

您可以在constraints 中使用泛型:

public class Content<T> where T : ContentProperties 
{
    public T Properties {get;set;}
}

public class Text : Content<TextProperties>
{
}

public class Image : Content<ImageProperties>
{
}

我编辑答案 - 您不必在子类中再次定义属性....

子类中的属性“Properties”的类型为TextPropertiesImageProperties

感谢您的cmets

【讨论】:

  • @JasmeetsinghBansal 是的,它会的。在 getter 和 setter 分别访问 TextProperties 和 ImageProperties 的派生类中,属性应该被声明为虚拟的并被覆盖。这样,您可以从 Properties 属性访问基本属性,并且当您想要访问特定于文本或图像的属性时,您可以访问 TextProperties 和 ImageProperties。一直以来只有一个属性实例。
  • @OfirWinegarten 只是一个疑问。如果我有一个可能是 Text 或 Image 的内容列表并且我只想更新这些对象的 ContentProperties 成员,此实现是否会导致问题。
  • 不,您可以随时这样做。 List&lt;ContentProperties&gt; 可以存储两个子类。一个简单的 foreach 将为您提供 ContentProperties,您始终可以选择使用 OfType 仅获取特定类型
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2015-11-17
  • 2018-03-11
相关资源
最近更新 更多