2014-10-02 19 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