2011-06-09 44 views
5

我的理解是,可以使用關鍵字override從派生類中覆蓋基類中的方法(標記爲Virtual)。C# - 是否有可能覆蓋同一類(不是派生類)中的基類中的方法?

但是如何覆蓋同一類中的方法呢?

在我的具體情況下,我有一個類x 2種方法。方法ab有一些共同的行爲,b增加了方法a的功能。

在過去,我在b中複製了a的代碼,並將新功能添加到b中。

我想知道是否有更好的方法,以便我可以集中方法a的行爲。

public class x 
    { 
     public static void a() {} 
     public static void b() {}   
    } 

感謝您的時間:-)!

回答

9

您可以簡單地在您的方法b()內調用您的方法a()。沒有必要(也沒有辦法)重寫一個方法。

public class x 
{ 
    private static int _i = 0; 

    public static void a() { 
     _i = 1; 
    } 
    public static void b() { 
     a(); 
     // here is _i = 1; 
    }   
} 

在另一方面,你可以有你的方法參數重載

​​

在這種情況下,您可以撥打a(1)a()具有相同的結果。

8

您不能在同一個類中重寫,只能在派生類中進行重寫。您可以將方法的常見行爲放在方法a中,然後從方法b調用它。

public static void a() 
{ 
// some common functionality 
} 

public static void b() 
{ 
// do something 
a(); //call a 
//do something else 
} 

您可以根據需要隨意多次撥打電話。

1

您將通用部分拆分爲第三種共享但私有方法。

2

爲什麼不從b()撥打a()

public static void b() 
{ 
    // Do some stuff 
    a(); // Do the common stuff 
    // Do more stuff 
} 
1

如果我理解正確,您的問題是,方法b具有與方法相同的代碼,再加上一些更多的代碼。像

public class x 
{ 
    public void a() 
    { 
     // a code 
    } 

    public void b() 
    { 
     // a code 

     // b code 
    } 
} 

東西,如果這是你可以調用方法的方法B這樣

class x 
{ 
    public void a() 
    { 
     // a code 
    } 

    public void b() 
    { 
     a(); 

     // b code 
    } 
} 

另一種情況的情況是,你有共同的代碼,這兩種方法:

class x 
{ 
    public void a() 
    { 
     // common code 

     // a exclusive code 
    } 

    public void b() 
    { 
     // common code 

     // b exclusive code 
    } 
} 

然後,您可以將該代碼提取到另一種方法,如下所示:

class x 
{ 
    public void a() 
    { 
     CommonMethod(); 

     // a exclusive code 
    } 

    public void b() 
    { 
     CommonMethod(); 

     // b exclusive code 
    } 

    private void CommonMethod() 
    { 
     // common code 
    } 
} 

並重寫相同類中的方法。它被稱爲method overloading,但它的工作原理允許您創建幾個名稱相同的方法,這些方法在輸入類型方面各不相同。

像這樣

class x 
{ 
    public string a(int i) 
    { 
    } 

    public string a(string s) 
    { 
    } 
} 

的唯一限制是這些方法必須(在這個例子中的字符串)相同的返回類型。

3

爲了我的理解,可以使用關鍵字覆蓋從派生類覆蓋基類中的方法(標記爲虛擬)。但是同樣重寫同一個類中的方法呢?

你不能這樣做。虛擬方法是Polymorphism,這是說的一個奇特的方式:

如果你寫,需要一個基類,並把它傳遞一個派生類,並且該方法調用基類的方法的方法,它將實際上調用派生實現。

class A 
{ 
    public virtual void DoSomething() { Console.WriteLine("From A"); } 
} 

class B : A 
{ 
    public override void DoSomething() { Console.WriteLine("From B"); } 
} 

class C 
{ 
    public void DoSomethingMagic(A someClassInstance) 
    { 
     someClassInstance.DoSomething(); 
    } 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     A a = new A(); 
     B b = new B(); 
     C c = new C(); 
     c.DoSomethingMagic(a); // Prints "From A" 
     c.DoSomethingMagic(b); // Prints "From B", even though it takes an A 

     A bIsAnA = new B(); 
     c.DoSomethingMagic(bIsAnA); // Prints "From B", because B is also an A 
    } 
} 

有了這個定義,嘗試「覆蓋」同一類中的方法是沒有意義的。

以我特定情況我有2種方法,方法a如用b某些共同行爲的一類的x,和b功能添加到方法的。

只需撥打a()b()

public class x 
{ 
    public static void a() 
    { 
     // "base" implementation here 
    } 

    public static void b() 
    { 
     a(); 
     // extra implementation here 
    } 
} 
+0

感謝Merlyn對上你的評論,我投了你的短信..是有助於我的理解感謝 – GibboK 2011-06-09 11:52:40

+0

@GibboK:您可能還需要檢查出的書:計算機程序的結構和解釋。它的主要目的是教你如何分解代碼。它使用Lisp,但它教授的每個概念都直接適用於任何現代語言。這本書也可以免費分發到網上。 http://mitpress.mit.edu/sicp/full-text/book/book.html。網絡上還有一個免費的視頻系列(或多或少)具有相同的內容。 – 2011-06-09 18:23:11

相關問題