我想知道是否有像方法繼承,而不是整個類繼承的任何功能,讓我解釋什麼,我試圖解釋:有沒有在C#方法繼承
class a {
public void GetA(){
// some logic here
}
}
class b {
public void GetB() : new Class().GetA()
}
我知道這看起來奇怪但我正在閱讀如何在對象組合模式中進行授權,並且出於某種原因我認爲這種模式。
我想知道是否有像方法繼承,而不是整個類繼承的任何功能,讓我解釋什麼,我試圖解釋:有沒有在C#方法繼承
class a {
public void GetA(){
// some logic here
}
}
class b {
public void GetB() : new Class().GetA()
}
我知道這看起來奇怪但我正在閱讀如何在對象組合模式中進行授權,並且出於某種原因我認爲這種模式。
如果您只是想在GetB()中調用GetA(),但不想在GetB()中定義或明確引用類a的實例,則可以將GetA()作爲委託來傳遞。
在C#中,有許多預定義的代表,如Action和Func。或者,您始終可以推出自己的代理以匹配方法簽名。
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);
}
}
哇,看起來很酷,我不知道這樣一個通用的解決方案.net已經提供,我一直在創建我自己的代表... – Tarik 2009-12-29 03:57:54
這是不可能的。如果你想b.GetB
重用a.GetA
的功能,那麼你需要實例化一個a
並調用a.GetA
。
'青睞構圖,而不是繼承。 – 2009-12-29 03:00:55
一個常用的組合方法是在類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執行的代碼()。
我能想到的最接近的是如何在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
類的構造函數。爲什麼這個相同的功能不適用於非構造函數方法,我不確定。
「家庭Sapien」是一個論據,對嗎? – Tarik 2009-12-29 03:54:35
@Aaron:是的,在'Human'構造函數中,「Home sapien」作爲'Animal'構造函數的'物種'參數傳遞。 – 2009-12-29 16:37:07
稍微不同的方法將在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
}
}
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對象的屬性。
如果你使用委託,你必須用相同的邏輯做更多的工作。
但代表可以得到不同的域對象,並做更多的應用程序的事情。
如果木屐()改爲靜態方法,你可以簡單地把它叫做GetB()函數中:
class a {
public static void GetA() {
// some logic here
}
}
class b {
public void GetB() {
a.GetA();
}
}
如果木屐()不是一成不變的,它沒有任何意義,因爲木屐()根據定義需要一個對象上下文(例如,不可見的「this」指針)。您不能將對象B的實例傳遞給類A,因爲類A不知道類B的任何內容。
你究竟想要做什麼?
其實我不是問是否存在相同的方式,也許有另一種方式在C#中做這個提供更好和有效的解決方案。但是整個類的繼承並不是我正在尋找的東西。 – Tarik 2009-12-29 02:48:21
是否有任何語言可以實現這一點? – GrayWizardx 2009-12-29 02:49:42
@GrayWizardx當然,這種類型的東西在許多語言中都是可能的,這些語言具有第一類對象的功能。我知道Python和JavaScript允許你做這種事情。 – 2009-12-29 02:50:57