Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 组合与继承。我哪里出错了?_C#_Oop_Composition - Fatal编程技术网

C# 组合与继承。我哪里出错了?

C# 组合与继承。我哪里出错了?,c#,oop,composition,C#,Oop,Composition,我需要在我的实体中建立组织层次结构模型。一个组织可以是总部、地区总部、分区、地区办事处。组织正在执行许多常见的功能,但也有一些特定的功能,例如,只有地区可以执行任务a。还有一些特定于地区的属性(数据) 我使用组合而不是继承对它进行建模,但现在我只使用了一个组织类,有很多引用,根据组织的类型,这些引用可以具有有效引用,也可以为null 对象合成是一种痛苦,现在我正通过工厂来处理它。但现在我主要关心的是开发人员需要记住组织类型是什么,以及属性是否对该组织有意义 只是想弄清楚我的意思 publ

我需要在我的实体中建立组织层次结构模型。一个组织可以是总部、地区总部、分区、地区办事处。组织正在执行许多常见的功能,但也有一些特定的功能,例如,只有地区可以执行任务a。还有一些特定于地区的属性(数据)

我使用组合而不是继承对它进行建模,但现在我只使用了一个组织类,有很多引用,根据组织的类型,这些引用可以具有有效引用,也可以为null

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

只是想弄清楚我的意思

    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){...}
    ...

    }
公共类组织:IKeyed{
公共虚拟整数Id{get;protected set;}
公共虚拟字符串代码{get;set;}
公共虚拟组织类型orgType{get;set;}
公共虚拟组织父级{get;set;}
公共虚拟IList子项{get;set;}
公共虚拟类型a{get;set;}//仅当组织类型为“总部”时才有意义
公共虚拟类型b{get;set;}//仅在“Region”时有意义
公共虚拟void AddChild(组织组织){…}
...
}

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

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

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
{
    // 
}
公共抽象类组织:IKeyed{
公共虚拟整数Id{get;protected set;}
公共虚拟字符串代码{get;set;}
//删除此属性
//公共虚拟组织类型orgType{get;set;}
公共虚拟组织父级{get;set;}
公共虚拟IList子项{get;set;}
//将此属性移动到子类
//公共虚拟类型a{get;set;}//仅当组织类型为“总部”时才有意义
//将此属性移动到子类
//公共虚拟类型b{get;set;}//仅在“Region”时有意义
公共虚拟void AddChild(组织组织){…}
... 
}
公共类总部:组织机构
{
公共虚拟类型{get;set;}
}
公共类区域:组织
{
公共虚拟类型b{get;set;}
}
公共类OtherOrganizationType:组织
{
// 
}

关于继承与组合的具体问题:我反复听到的格言是“当对象A是对象B的一种类型时使用继承。当对象A由对象B组成时使用组合”

在这种情况下,你不能说地区办事处是总部的一种类型。你也不能说总部是由地区办事处组成的。这告诉我对象不应该直接相关。相反,想想是什么让他们能够完成共同的任务。也许他们都可以雇佣工作人员,因为他们都是雇佣组织,也许他们都可以报告销售,因为他们都是销售实体。在这些情况下,您应该有一个Hiringorgization或SalesEntity超类,其中总部和地区办事处都是子类


就组织结构而言,可能值得考虑在单独的OrgStructure对象中维护该结构。OrgStructure对象将维护所有对象实例之间的关系,而不是在每个对象中都有父属性和子属性。这提供了更大的灵活性,并消除了将关系维护到专用对象中的责任。

可能有层次结构而不是将TypeA/TypeB作为基类属性会更舒适、更方便。我在这儿没看到作文。。任何组织都可以包含其他组织吗?即使是这样,在相关的课程中仍然有TypeA和TypeB可能会更容易使用。为了简洁起见,我已经简化了很多,忘记了一个事实,即每个组织都有一个关于父级的参考,以及它的子组织。@YavgenyP TypeA和typeB引用的属性仅在组织类型为(比如)总部时有用。。只有当类型为say Region时,才会有很多其他引用有效。。。因此,我看不到更好的解决方案,通过使用继承创建类的层次结构..Hmmmn感谢@YavgenyP。我怀疑是这样的。所有这些关于继承权的谈判使事情变得非常困难