2009-12-29 84 views
3

我想知道是否有像方法繼承,而不是整個類繼承的任何功能,讓我解釋什麼,我試圖解釋:有沒有在C#方法繼承

class a { 
    public void GetA(){ 
    // some logic here 
} 
} 

class b { 
    public void GetB() : new Class().GetA() 
} 

我知道這看起來奇怪但我正在閱讀如何在對象組合模式中進行授權,並且出於某種原因我認爲這種模式。

+0

其實我不是問是否存在相同的方式,也許有另一種方式在C#中做這個提供更好和有效的解決方案。但是整個類的繼承並不是我正在尋找的東西。 – Tarik 2009-12-29 02:48:21

+0

是否有任何語言可以實現這一點? – GrayWizardx 2009-12-29 02:49:42

+0

@GrayWizardx當然,這種類型的東西在許多語言中都是可能的,這些語言具有第一類對象的功能。我知道Python和JavaScript允許你做這種事情。 – 2009-12-29 02:50:57

回答

4

如果您只是想在GetB()中調用GetA(),但不想在GetB()中定義或明確引用類a的實例,則可以將GetA()作爲委託來傳遞。

在C#中,有許多預定義的代表,如ActionFunc。或者,您始終可以推出自己的代理以匹配方法簽名。

class a 
    { 
     public void GetA() 
     { 
      Console.WriteLine("Hello World!"); 
     } 
    } 

    class b 
    { 
     // No explicit reference to class a of any kind. 
     public void GetB(Action action) 
     { 
      action(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var a = new a(); 
      var b = new b(); 

      b.GetB(a.GetA); 
     } 
    } 
+0

哇,看起來很酷,我不知道這樣一個通用的解決方案.net已經提供,我一直在創建我自己的代表... – Tarik 2009-12-29 03:57:54

1

這是不可能的。如果你想b.GetB重用a.GetA的功能,那麼你需要實例化一個a並調用a.GetA

+1

'青睞構圖,而不是繼承。 – 2009-12-29 03:00:55

4

一個常用的組合方法是在類b中創建一個類型爲a的私有成員變量,並在GetB()中調用a.GetA()。例如:

class a { 
    public void GetA(){ 
    // some logic here 
    } 
} 

class b { 
    private a _a=new a(); 

    public void GetB() 
    { 
     _a.GetA(); 
    } 
} 

另一種選擇可能是定義稱爲GetB代替簡單方法的委託成員變量,並允許調用代碼供給由GetB執行的代碼()。

+0

你能告訴我做這種模式的好處嗎?謝謝。 – Tarik 2009-12-29 03:53:04

+0

@Aaron,這樣做的好處與一般使用組合物的好處相同。它允許你隱藏關於你的實現的更多細節,然後繼承。在這個例子中,類B的調用者不需要知道你實際使用類A來實現GetB()。所以它通常比繼承更靈活和鬆散耦合。 – Ash 2009-12-29 04:02:33

3

我能想到的最接近的是如何在C#中,你可以「繼承」一類的,因爲它的子類的構造函數(或同一類的重載的構造函數),像這樣:

class Animal { 
    public string Species { get; set; } 

    public Animal(string species) { 
     Species = species; 
    } 
} 

class Human : Animal { 
    public string Name { get; set; } 

    public Human(string name) : base("Homo sapien") { 
     Name = name; 
    } 
} 

上述代碼的行爲非常簡單:Human類的構造函數實際上在做任何事情之前調用Animal類的構造函數。爲什麼這個相同的功能不適用於非構造函數方法,我不確定。

+0

「家庭Sapien」是一個論據,對嗎? – Tarik 2009-12-29 03:54:35

+0

@Aaron:是的,在'Human'構造函數中,「Home sapien」作爲'Animal'構造函數的'物種'參數傳遞。 – 2009-12-29 16:37:07

0

稍微不同的方法將在ClassB構造函數接受ClassA一個實例,而不是直接將其實例化。這將被應用到Dependency Inversion Principle灰@的回答:

public class ClassB 
{ 
    private readonly ClassA _a; 

    public b(ClassA a) 
    { 
     _a = a; 
    } 

    public void GetB() 
    { 
     _a.GetA(); 

     // Other logic 
    } 
} 
0
public class Article 
{ 

public object AddOrUpdate(params object[] paras){ 

    return null; 

    } 

} 

public class Test:Article 
{ 

public new object AddOrUpdate(params object[] paras){ 

    //do your logic...... 

    return base.AddOrUpdate(paras); 

} 


} 

你的意思是這樣,這是inhret一個類可以不獲取或設置BASE對象的屬性。

如果你使用委託,你必須用相同的邏輯做更多的工作。

但代表可以得到不同的域對象,並做更多的應用程序的事情。

0

如果木屐()改爲靜態方法,你可以簡單地把它叫做GetB()函數中:

class a { 
    public static void GetA() { 
    // some logic here 
    } 
} 

class b { 
    public void GetB() { 
     a.GetA(); 
    } 
} 

如果木屐()不是一成不變的,它沒有任何意義,因爲木屐()根據定義需要一個對象上下文(例如,不可見的「this」指針)。您不能將對象B的實例傳遞給類A,因爲類A不知道類B的任何內容。

你究竟想要做什麼?