2009-11-20 21 views
29

オブジェクト構造を作成していて、ベースのすべてのサブクラスに強制的にメソッドを実装したいとします。私はそれをやって考えることができサブクラスにメソッドの実装を強制する方法

唯一の方法は以下の通りであった。

  1. 抽象クラス - 動作しますが、基本クラスは、サブクラスの一部で慣れるいくつかの有用なヘルパー関数を持っています。

  2. インターフェイス - 基本クラスだけに適用された場合、サブクラスは基本クラスだけの機能を実装する必要はありません。

これは可能ですか?

N.B.これは.NET 2アプリケーションです。

+4

抽象クラスで抽象メソッドを作成する場合、そのメソッドを実装するためにサブクラスを必要としないことに注意してください。あなたが好きなだけ多くのサブクラスを実装することはできません。それらはすべて抽象的でなければなりません。 –

+1

FWIW正しいOOの用語は* function *であり、* function *ではありません。 –

答えて

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

+0

うわー、ありがとう。私は、抽象クラスがそれらの中に機能性を持つメソッドを持つことができないことを認識しました。 – tgandrews

+0

抽象メソッドには機能がありません。機能は継承クラスにある必要があります –

6

はい、そしてあなたがこれを行うために必要なすべてのクラスが論理的に既存の抽象基底クラスのサブクラスである場合は、基底クラスに抽象メソッドを追加...これは理由のインターフェースよりも優れています(例えば、抽象基本クラスメソッドをデフォルト実装の仮想メソッドに変更することによって)実装を後で追加することができます。例えば、10の派生クラスのうち8つが同じ実装を持ち、2つだけ異なる...

EDIT:(以下のコメントのスレッドに基づいて)これを行うには、基本クラスを抽象として宣言する必要があります。非抽象クラスで抽象メソッドを使用することはできません。抽象クラスはインスタンス化することができますそのインスタンスが作成された場合、そのメソッドの実装は行われません。だからこれは違法です。ベースを抽象として宣言することにより、クラスのインスタンス化を禁止します。その後、非抽象的な派生のクラスのみをインスタンス化することができます。ここで、(基本メソッドは抽象型であるため)そのメソッドの実装を追加する必要があります。

+0

コンパイラは私に、働くおそらくこれは.NET 2なのであろうか? – tgandrews

+1

@Thoku:それは言語のすべてのバージョンで起こります。抽象メソッドを持つ具体的なクラスを持つことはできません。 –

9

抽象クラス - 動作しますが、 基底クラスは サブクラッセ

の一部で慣れる 機能抽象クラスは、それが提供するすべての機能を必要としないいくつかの有用なヘルパーを持っているだろう抽象的であること。

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

あなたはprotectedpublicを交換する場合は、マークされたメソッドは、基底クラスとサブクラスにのみ表示されることに注意してください。

+1

はい、私はあなたがこれを行うことができるとは思わなかった。私はC#を毎日もっと愛しています。 – tgandrews

+0

@Thoku:これはC#固有の動作ではありません。すべてのクラスベースのオブジェクト指向言語は、この動作を示します。 –

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"); 
    } 
} 
関連する問題