2009-11-20 84 views
29

我正在創建一個對象結構,我希望強制所有基類的子類實現一個方法。如何強制子類實現一個方法

我能想到這樣做的唯一途徑是:

  1. 一個抽象類 - 的工作,但基類有習慣通過一些子類的一些有用的輔助功能。

  2. 一個接口 - 如果僅適用於基類,那麼子類不必實現僅基類具有的功能。

這可能嗎?

N.B.這是一個.NET 2應用程序。

+4

請注意,在抽象類中創建抽象方法並不需要子類來實現該方法。您可以製作儘可能多的子類,而不需要實現它;他們都必須是抽象的。 – 2009-11-20 16:55:53

+1

FWIW正確的OO術語是* method *,而不是* function *。 – 2009-11-20 17:08:25

回答

47

您可以使用其他實現的方法在類中創建抽象方法。與接口相比,其優點是可以在類中包含一些代碼,並強制新對象填寫抽象方法的詳細信息。

public abstract class YourClass 
{ 
    // Your class implementation 

    public abstract void DoSomething(int x, int y); 

    public void DoSomethingElse(int a, string b) 
    { 
     // You can implement this here 
    } 
} 
+0

查看評論我留在查爾斯的迴應 – tgandrews 2009-11-20 16:55:19

+0

哇謝謝,工作。我沒有意識到抽象類可能具有其中的功能的方法。 – tgandrews 2009-11-20 16:57:38

+0

抽象方法在其中沒有功能;該功能需要在繼承類 – 2009-11-20 17:02:25

6

是的,如果你需要做到這一點的類在邏輯上是現有的抽象基類的子類,然後添加一個抽象方法的基礎類...這是不是因爲它的界面更好允許您稍後添加實現(通過將默認實現將抽象基類方法更改爲虛擬方法),如果/當事實證明十個派生類中的八個具有相同的實現,並且說只有其中兩個不同...

編輯:(基於下面評論中的線程)基類必須聲明爲抽象才能做到這一點......在非抽象類中不能有抽象方法,抽象類可以是實例化的並且如果創建了它的一個實例,那麼該方法就沒有實現。所以這是非法的。通過將基數聲明爲抽象,可以禁止類的實例化。然後,只有非抽象的派生的類可以被實例化,其中,(因爲基本方法是抽象的),你必須爲該方法添加一個實現。

+0

編譯器抱怨我的基類必須是抽象的上班。也許這是因爲它是.NET 2? – tgandrews 2009-11-20 16:54:15

+1

@Thoku:發生在所有版本的語言中。抽象方法不能具有具體的類。 – 2009-11-20 16:56:04

9

一個抽象類 - 的工作,但在 基類有一個習慣通過一些 子CLASSE的

一個抽象類不需要它提供了所有功能的一些有用的幫手, 功能抽象。

abstract class Base { 
    public void Foo() {} // Ordinary method 
    public virtual void Bar() {} // Can be overridden 
    public abstract void Xyz(); // This one *must* be overridden 
} 

請注意,如果您有protected更換public,標記方法將可見的基類和子類。

+1

是的,我不知道你可以做到這一點。我每天都越來越熱愛C#。 – tgandrews 2009-11-20 16:59:26

+0

@Thoku:這不是C#特有的行爲。所有基於類的面向對象的語言都表現出這種行爲。 – 2009-11-20 17:10:00

12

的接口 - 如果適用於只是 基類,則子類不 要實現該功能僅 基類一樣。

這不完全正確。如果基類是抽象的,則可以將屬於該接口的方法標記爲抽象,並強制實施該子類。

這帶來了一個你沒有提到的選項:使用兩者。你有一個IFoo接口,並且一個FooBase抽象基類實現它,或者它的一部分。這爲子類提供了接口(或其一部分)的「默認」實現,並且還允許從其他類繼承並仍然實現該接口,或者如果要實現接口但不繼承基類實現。一個例子可能有所幫助:

// Your interface 
interface IFoo { void A(); void B; } 

// A "default" implementation of that interface 
abstract class FooBase : IFoo 
{ 
    public abstract void A(); 

    public void B() 
    { 
     Console.WriteLine("B"); 
    } 
} 

// A class that implements IFoo by reusing FooBase partial implementation 
class Foo : FooBase 
{ 
    public override void A() 
    { 
     Console.WriteLine("A"); 
    } 
} 

// This is a different class you may want to inherit from 
class Bar 
{ 
    public void C() 
    { 
     Console.WriteLine("C"); 
    } 
} 

// A class that inherits from Bar and implements IFoo 
class FooBar : Bar, IFoo 
{ 
    public void A() 
    { 
     Console.WriteLine("Foobar.A"); 
    } 
    public void B() 
    { 
     Console.WriteLine("Foobar.B"); 
    } 
} 
相關問題