我正在創建一個對象結構,我希望強制所有基類的子類實現一個方法。如何強制子類實現一個方法
我能想到這樣做的唯一途徑是:
一個抽象類 - 的工作,但基類有習慣通過一些子類的一些有用的輔助功能。
一個接口 - 如果僅適用於基類,那麼子類不必實現僅基類具有的功能。
這可能嗎?
N.B.這是一個.NET 2應用程序。
我正在創建一個對象結構,我希望強制所有基類的子類實現一個方法。如何強制子類實現一個方法
我能想到這樣做的唯一途徑是:
一個抽象類 - 的工作,但基類有習慣通過一些子類的一些有用的輔助功能。
一個接口 - 如果僅適用於基類,那麼子類不必實現僅基類具有的功能。
這可能嗎?
N.B.這是一個.NET 2應用程序。
您可以使用其他實現的方法在類中創建抽象方法。與接口相比,其優點是可以在類中包含一些代碼,並強制新對象填寫抽象方法的詳細信息。
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
}
}
是的,如果你需要做到這一點的類在邏輯上是現有的抽象基類的子類,然後添加一個抽象方法的基礎類...這是不是因爲它的界面更好允許您稍後添加實現(通過將默認實現將抽象基類方法更改爲虛擬方法),如果/當事實證明十個派生類中的八個具有相同的實現,並且說只有其中兩個不同...
編輯:(基於下面評論中的線程)基類必須聲明爲抽象才能做到這一點......在非抽象類中不能有抽象方法,抽象類可以是實例化的並且如果創建了它的一個實例,那麼該方法就沒有實現。所以這是非法的。通過將基數聲明爲抽象,可以禁止類的實例化。然後,只有非抽象的派生的類可以被實例化,其中,(因爲基本方法是抽象的),你必須爲該方法添加一個實現。
編譯器抱怨我的基類必須是抽象的上班。也許這是因爲它是.NET 2? – tgandrews 2009-11-20 16:54:15
@Thoku:發生在所有版本的語言中。抽象方法不能具有具體的類。 – 2009-11-20 16:56:04
一個抽象類 - 的工作,但在 基類有一個習慣通過一些 子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
,標記方法將只可見的基類和子類。
是的,我不知道你可以做到這一點。我每天都越來越熱愛C#。 – tgandrews 2009-11-20 16:59:26
@Thoku:這不是C#特有的行爲。所有基於類的面向對象的語言都表現出這種行爲。 – 2009-11-20 17:10:00
的接口 - 如果適用於只是 基類,則子類不 要實現該功能僅 基類一樣。
這不完全正確。如果基類是抽象的,則可以將屬於該接口的方法標記爲抽象,並強制實施該子類。
這帶來了一個你沒有提到的選項:使用兩者。你有一個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");
}
}
請注意,在抽象類中創建抽象方法並不需要子類來實現該方法。您可以製作儘可能多的子類,而不需要實現它;他們都必須是抽象的。 – 2009-11-20 16:55:53
FWIW正確的OO術語是* method *,而不是* function *。 – 2009-11-20 17:08:25