2014-10-02 21 views
0

我有一个具有一些功能的类。这些函数可以在“NameSpace”中进行分类。 我搜索一种方法将每个函数组织成一个名字空间到我的类中。 有人建议我改变我的方法。使用接口而不是继承。将功能组织到一个类中(按类别)

这里是一些样品BE了解

public class Class1 
    { 
     public string A = "A"; 
     public string B = "B"; 
     public int one = 1; 
     public int two = 2; 

     public Printer globalPrinter; 


    } 

public class Class10 : Class1 
{ 
    public class Letter 
    { 
     public void FunctionA() 
     { 
      globalPrinter.print(A); 
     } 
     public void FunctionB() 
     { 
      globalPrinter.print(B); 
     } 
    } 

    public class Number 
    { 

     public void Function1() 
     { 
      globalPrinter.print(one); 
     } 
     public void Function2() 
     { 
      globalPrinter.print(two); 
     } 
    } 


} 

public class ClassX : Class10 
{ 
    public ClassX() 
    { 
     Letter.FunctionA(); 
     Letter.FunctionB(); 
     Number.Function1(); 
     Number.Function2(); 
    } 
} 

var c10 = new ClassX(); 

此代码不能正常工作。你可以看看,在样品结束时,你会看到

Letter.FunctionA(); 
    Letter.FunctionB(); 
    Number.Function1(); 
    Number.Function2(); 

我可以简单地将FunctionA和FunctionB放入Class10中。但如果有100个功能。将功能分成类别可能更有趣。

让我看看你的问题的方法。


我添加了一些帮助分类的项目。


答案全码

public class Class1 
    { 
     public string A = "A"; 
     public string B = "B"; 
     public int one = 1; 
     public int two = 2; 

     public void globalPrinter(object t) 
     { 
     } 
    } 

    public class Class10 : Class1 
    { 
     public class Letter 
     { 
      readonly Class10 parent; 
      public Letter(Class10 parent) 
      { 
       this.parent = parent; 
      } 
      public void FunctionA() 
      { 
       parent.globalPrinter(parent.A); 
      } 
      public void FunctionB() 
      { 
       parent.globalPrinter(parent.B); 
      } 
     } 

     public class Number 
     { 
       readonly Class10 parent; 
       public Number(Class10 parent) 
      { 
       this.parent = parent; 
      } 
      public void Function1() 
      { 

       parent.globalPrinter(parent.one); 
      } 
      public void Function2() 
      { 
       parent.globalPrinter(parent.two); 
      } 
     } 
    } 

    public class ClassX : Class10 
    { 
     public ClassX() 
     { 
      new Letter(this).FunctionA(); 
      new Letter(this).FunctionB(); 
      new Number(this).Function1(); 
      new Number(this).Function2();     
     } 
    } 

    ClassX c10 = new ClassX(); 
+1

您提供的示例代码有点难以遵循,并且没有做太多工作来演示正在建模的对象的语义。根据你想要实现的内容,接口可能确实是答案的一部分。也就是说,如果方法的任何给定的子集可以在语义上分组为特定的功能合同。但根据所提供的示例无法知道,因为它没有任何有意义的上下文。你能创建一个更真实的例子,并且更清楚地描述这个问题吗? – David 2014-10-02 18:19:42

+1

FunctionA(),FunctionB()和FunctionC()需要是静态的,以在不创建类的实例的情况下调用它们。 Class1中的变量A和B也是如此。 – tdbeckett 2014-10-02 18:23:36

+0

我更改我的示例以获取分类的更多详细信息。 – forX 2014-10-02 18:48:58

回答

1

的问题是,像Class10.Letter子类不是继承层次结构,它的父类Class10是一部分的一部分。

所以,Class10.Letter不会Class1Class1继承,只有Class10继承,所以Class10.Letter需要的Class1Class10一个实例,因此它可以从Class10访问globalPrinter

public class Class10: Class1 { 
    public class Letter { 
     readonly Class10 parent; 
     public Letter(Class10 parent) { 
      this.parent = parent; 
     } 
     public void FunctionA() { 
      parent.globalPrinter.print(parent.A); 
     } 
    } 
} 

而且ClassX继承所以它可以访问Class10函数,但它不会继承自Class10.Letter,所以如果它调用非静态函数,则ClassX需要一个Letter的实例:

public ClassX() { 
    new Letter(this).FunctionA(); 
    ... 
+0

我不能,函数一个不能静态,因为它使用当前/父对象的非静态变量。 – forX 2014-10-02 18:51:32

+0

那么,你已经改变了样本,所以现在Class20没有定义。无论如何,如果一个函数不是静态的,你需要用new来创建一个类的实例。 – 2014-10-02 18:57:36

+0

你的权利,我改变我的样本,有人在评论中要求。是的,我的“主类”ClassX将被实例化。需要包含变量并设置globalPrinter。 – forX 2014-10-02 19:06:34