面向对象的范例 - C#

Mut*_*han 4 c# oop

我的场景:考虑两个类class SubGroup,和 class Group.我希望没有其他类可以创建SubGroup's没有的对象Group,因为SubGroups没有它就不会存在Group.但是, Group没有任何可以存在SubGroup.另外,Group可以包含多个SubGroup's.

class SubGroup{
  private SubGroup(int arg){
  }

 }

class Group{  
   List<SubGroup> list;
   Group(int param){
     list  = new List<SubGroup>();
   }

   SubGroup createChild(int args){
       return new SubGroup(int args);  // I need to access SubGroups constructor?? (without using inheritance).
   }
 }


 class C{
      Group b = new Group(param);
      SubGroup a = b.createChild(args); // since constructor is not visible here. bcz, SubGroup  will not exist without Group.
 }   
Run Code Online (Sandbox Code Playgroud)

我曾经尝试过: 我可以让Group继承SubGroup并使SubGroup构造函数成为受保护的,但这表示相关性is-a,即每个Group都是一个SubGroup.但实际上并非如此.

此外,我想要一个arg来创建一个子组,但是在创建Group期间我没有参与子组的参数,因此我不能使用继承.

内部类:内部类无济于事,因为我有SuperGroup,SubGroup,MicroGroup很多层.实际上它是一个金融项目,我有... Account,AccountHead,SubGroup,Group等也可能会创建内层.这将降低可读性.

我怎样才能在C#中实现?

Tig*_*ran 7

我不希望其他类创建除Group之外的SubGroup对象,因为没有Group,SubGroups将不存在.

为什么不在声明中反转依赖:

class Group{  
   List<SubGroup> list;
   ... 
   public void AddSubgroup(SubGroup sub) {
       list.Add(sub);
   }
 }

class SubGroup{

  ///private ctor, can be used only inside class
  private SubGroup(int arg){
  }

  public static Subgroup Create(Group parent, int arg) {
       Subgroup sub = new Subgroup(arg);//use private ctor
       parent.AddSubgroup(sub);
       return sub;
  }

 }
Run Code Online (Sandbox Code Playgroud)

所以这一切你将使用如下:

var group = new Group(); 
var subgroup = Subgroup.Create(group, 2); 
Run Code Online (Sandbox Code Playgroud)


pok*_*oke 6

您应该考虑是否确实需要在不同级别的组之间进行类型区分.在许多情况下,只需构建一个复合模式就足够了,其中一个对象可以有多个相同(或常见)类型的子对象.这允许您将对象嵌套在一个自由的事物中.

相反,你应该考虑你的不同群体水平在行为上是否真的不同.例如,2级组和3级组之间有什么区别?除了父级和子级别之外,他们是否共享相同的行为?如果是这样,你一定要把它们结合起来.

如果您甚至需要限制除了父组之外的任何人都可以创建子组,您应该考虑另一件事.为什么你甚至需要那个?限制除了组之外的任何人都可以向其自身添加子组是有意义的,但是对象创建通常不是真正的问题(相反,如果您可以在没有进一步依赖性的情况下自由创建对象,它实际上更有帮助 - 这允许您测试它!).

例如,您的群组可能如下所示:

class Group
{
    private List<Group> childs;
    public Group(int arg)
    { ... }

    // pass an existing object
    public void AddSubgroup(Group g)
    {
        childs.add(g);
    }

    // or create the object inside
    public void AddSubgroup(int arg)
    {
        childs.add(new Group(arg));
    }
}

// used like this
Group b = new Group(param);
Group a = new Group(args);
b.AddSubgroup(a);
Run Code Online (Sandbox Code Playgroud)

您甚至可以创建一个与您的"根"组对应的特殊子类型,并且所有其他组都具有受保护的构造函数,并且只能由它们自己的类型(组或根组)创建.


Fen*_*ndy 5

没有指定对象存在时无法创建?听起来像构造函数注入我.

public class SubGroup{
    public SubGroup(Group group){
        if(group == null) {
            throw new InvalidOperationException("A subgroup must has a group");
        }
        this.group = group;
    }
    Group group;
}
Run Code Online (Sandbox Code Playgroud)

这样,您将无法创建没有组的子组,如果传递null,则会抛出运行时异常.背面?无法序列化,无法在ORM中使用.

不确定这是否符合您的要求.