代码之家  ›  专栏  ›  技术社区  ›  Jasmeet

区分子类和父类对象?

  •  4
  • Jasmeet  · 技术社区  · 7 年前

    我正在研究两个类似于下面的层次结构-

    层次结构1:

    public class Content
    {
    }
    
    public class Text : Content
    {
    }
    
    public class Image : Content
    {
    }
    

    层次结构2:

    public class ContentProperties
    {
    }
    
    public class TextProperties : ContentProperties
    {
    }
    
    public class ImageProperties : ContentProperties
    {
    }
    

    现在我想实现两个行为:

    首先,我想要contentproperties在content中的一个属性,这样我就可以将它泛化为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.
    

    我可以通过在单独的子类中保留个人属性来实现第二个行为,但这与我的第一个行为相矛盾。另外,我不想通过创建两个独立的对象来保留冗余数据。我可以使用签入属性setter或使用setter方法来实现类似的功能,但是,这并不是确切的行为。

    有人能建议我怎样才能达到上述行为吗?

    如果标题措辞不正确,引起误会,敬请原谅。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Ofir Winegarten    7 年前

    您可以将泛型与 constraints 以下内容:

    public class Content<T> where T : ContentProperties 
    {
        public T Properties {get;set;}
    }
    
    public class Text : Content<TextProperties>
    {
    }
    
    public class Image : Content<ImageProperties>
    {
    }
    

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

    子类中的属性“properties”将是 TextProperties ImageProperties 是的。

    谢谢你的评论