我的场景:考虑两个类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#中实现?
我不希望其他类创建除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)
您应该考虑是否确实需要在不同级别的组之间进行类型区分.在许多情况下,只需构建一个复合模式就足够了,其中一个对象可以有多个相同(或常见)类型的子对象.这允许您将对象嵌套在一个自由的事物中.
相反,你应该考虑你的不同群体水平在行为上是否真的不同.例如,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)
您甚至可以创建一个与您的"根"组对应的特殊子类型,并且所有其他组都具有受保护的构造函数,并且只能由它们自己的类型(组或根组)创建.
没有指定对象存在时无法创建?听起来像构造函数注入我.
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中使用.
不确定这是否符合您的要求.