c# - 组合与继承。我哪里做错了?

标签 c# oop composition

我需要在我的实体中为组织层次结构建模。一个组织可以是总部、区域负责人、次区域、地区办公室。组织正在执行许多通用功能,但有几个功能是特定的,例如只有区域可以执行任务 A。还有一些特定于区域的属性(数据)。

我使用组合而不是继承对其进行建模,但现在我只得到了一个组织类,其中有很多引用,根据组织的类型,这些引用可能具有有效引用或为空。

对象组合是一个痛苦,现在我正在通过工厂处理。但现在我主要关心的是开发人员需要记住组织类型是什么以及属性是否对该组织有某种意义。

只是为了清楚我的意思。

    public class Organization : IKeyed<int> {
        public virtual int Id { get; protected set; }
        public virtual string Code { get; set; }
        public virtual OrganizationType orgType {get;set;}
        public virtual Organization Parent {get;set;}
        public virtual IList<Organization> Children {get;set;}

        public virtual typeA {get; set;} // only meaningful when organization type is 'Head office'

        public virtual typeB {get;set;}// only meaningful when 'Region'
        public virtual void AddChild(Organization org){...}
    ...

    }

我应该在这里使用继承吗?还是我在这里遗漏了一些技巧?

最佳答案

在我看来,我建议您创建一个包含通用行为和字段的抽象基类。然后您可以添加子类来扩展更具体的行为和/或属性。

public abstract class Organization : IKeyed<int> { 
    public virtual int Id { get; protected set; } 
    public virtual string Code { get; set; }

    // remove this property
    // public virtual OrganizationType orgType {get;set;} 
    public virtual Organization Parent {get;set;} 
    public virtual IList<Organization> Children {get;set;} 

    // move this property to sub-class
    // public virtual typeA {get; set;} // only meaningful when organization type is 'Head office' 

    // move this property to sub-class
    // public virtual typeB {get;set;}// only meaningful when 'Region'

    public virtual void AddChild(Organization org){...} 
    ... 

}

public class HeadOffice : Organization
{
    public virtual typeA { get; set; }
}

public class Region : Organization
{
    public virtual typeB { get; set;}
}

public class OtherOrganizationType : Organization
{
    // 
}

关于c# - 组合与继承。我哪里做错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12890224/

相关文章:

c# - 尝试在 C# 上使用 AutoCAD 类镜像绘图

c# - 按发件人电子邮件地址查找电子邮件 - 过滤器语法

c++ - 有2个类,如何在上面的类中使用下面类的对象?

JavaScript 继承 Object.call() 未定义

html - 第二级@import。如何导入导入的 .css 文件?

c# - 抽象基类或辅助类

java - 如何从 Java 线程中调用 invokeLater 方法?

c# - 更新 Xml 文件中的行

c# - 限制属性使用在设计时互斥?

c++ - 按指定顺序绘制形状