如何设计这些类的最佳方法?

时间:2013-12-11 00:34:39

标签: c# oop inner-classes

我有一个问题,如何在一个好的(更好的)模型中设计以下案例(我正在使用C#): 到目前为止,它是这样的:

 public class ExampleClass
 {

    private object ExampleClassPrivate;
    public SubExampleClass SubExampleClassPublic;

    -------

    public void ChangeExampleClassPrivate()
    {
        ExampleClassPrivate = "SOMETHING";
    }

    private class SubExampleClass
    {
        private object SubExampleClassPrivate;
        public SubSubExampleClass SubSubExampleClassPublic;
        .
        .
        .
    }

    public class SubSubExampleClass
    {
         ...

         public void DoSomething()
         {
         //Do something within SubSubExampleClass
         //In the end: call ChangeExampleClassPrivate()
         }
    }
 }

我可以做以下事情: 我创建了一个ExampleClass的实例,我们称之为“TestInstance”。 然后:

TestInstance.SubExampleClassPublic.SubSubExampleClassPublic.DoSomething();
TestInstance.ChangeExampleClassPrivate();

但我不希望在DoSomething()之后手动执行ChangeExampleClassPrivate()。我希望有可能从DoSomething()内部调用ChangeExampleClassPrivate()。

我怎么能实现这个目标?我想我的班级结构并不完美,但我不知道如何改变它以正确的方式工作。

1 个答案:

答案 0 :(得分:0)

您可以将对父类的引用传递给所有子类,如下所示:

private class SubExampleClass
{
     private object SubExampleClassPrivate;
     private readonly SubSubExampleClass SubSubExampleClassPublic;

     private readonly ExampleClass parent;

     public SubExampleClass(ExampleClass parent)
     {
         // save reference to the parent object
         this.parent = parent; 

         // pass it to subclass
         SubSubExampleClassPublic= new SubSubExampleClass(parent)
     }

    .
    .
    .
}

public class SubSubExampleClass
{
     private readonly ExampleClass parent;

     public SubSubExampleClass(ExampleClass parent)
     {
         this.parent = parent; // save reference to the parent object
     }

     public void DoSomething()
     {
         //Do something within SubSubExampleClass
         parent.ChangeExampleClassPrivate;
     }
}

一个用法,在Example Class中的某个地方:

var instance = new SubExampleClass(this);
instance.SubSubExampleClassPublic.DoSomething();