2016-12-05 6 views
-1

抽象クラスには2つの抽象メソッドMethod1()とMethod2()、 がありますが、派生クラスでMethod1()を継承したいのはどうですか?C#の2つの抽象メソッドのうち抽象クラスから1つのメソッドだけを実装する方法は?

public abstract class BaseClass 
{ 
    public abstract void Method1(); 

    public abstract void Method2(); 
} 
+3

public abstract class BaseClass : IMethodOne, IMethodTwo { public abstract void Method1(); public abstract void Method2(); } 

とクラス。おそらく、これらのメソッドをインターフェースで定義し、それらのインターフェースを任意のクラスで選択的に実装することを意図していたでしょうか? – David

+1

あなたはこれを望む理由を説明できますか? – weston

+0

ようこそスタックオーバーフロー。私はこれが[xy問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)だと思う。あなたはおそらくもっと良い方法で解決できる全く別の問題を解決するために何かをしようとしています。あなたが直面している実際の問題で新しい質問を投稿してください。 –

答えて

3

本当にすることはできません...あなたがはへを持っている場合は(と私は本当にその理由を質問します)いくつかのオプションがあります:

あなたは抽象以上の任意のコントロールを持っていない場合クラスに関連し、この特定の抽象クラスを使用する必要があります、唯一の方法は、派生クラスの実装をNotImplementedExceptionをスローすることです。

public MyDerivedClass: BaseClass 
{ 
    public override void Method1() 
    { 
      // implementation of Method1 
    } 
    public override void Method2() 
    { throw new NotImplementedException(); } 
} 

...またはと呼ばれる別の抽象基本クラスを作成するには、Baseclassを変更するので、それはOnlyDoMethod1

public abstract class BaseClass: OnlyDoMethod1 
{ public abstract void Method2(); } 

から継承し、どこでもあなたが唯一の希望OnlyDoMethod1を使用し、その後、OnlyDOMethod1

public abstract class OnlyDoMethod1 
{ public abstract void Method1(); } 

を言いますMethod1

public MyDerivedClass: OnlyDoMethod1 
{ 
    public override void Method1() 
    { 
     // implementation of Method1 
    } 
} 
+0

'派生クラスの実装でNotImplementedExceptionがスローされるようにしましょう.' - 未来の読者にはあまり良いアドバイスはありません – Fabio

1

あなたが探しているのはインターフェイスだと思います。このような何か:

public interface ICanDoMethod1 
{ 
    void Method1(); 
} 

public interface ICanDoMethod2 
{ 
    void Method2(); 
} 

は、その後、あなたのクラスで、あなたがそれらを選択的に実装できます。

public class JustMethod1 : ICanDoMethod1 
{ 
    // implement Method1 here 
} 

public class Both : ICanDoMethod1, ICanDoMethod2 
{ 
    // implement both here 
} 

// etc. 

基本的に、任意のクラスはいずれか、または多態任意の型として解釈されないことができます。タイプが、部分がの場合は、実際には2種類あります。 C#は単一継承であるため、複数の型を実装するにはインタフェースを使用します。


逆に、継承をチェーンすることもできます。このような何か:

オプションは、選択と選択できるようにしたいと「1」または「1と2を」したい(ただし、ない場合はつまり、スタックあればうまくいく
public abstract class Base1 
{ 
    public abstract void Method1(); 
} 

public abstract class BaseBoth : Base1 
{ 
    public abstract void Method2(); 
} 

public class JustOne : Base1 
{ 
    // only implement Method1 here 
} 

public class Both : BaseBoth 
{ 
    // implement both here 
} 

ちょうど "2")。


最後の手段として、あなたは明示的に他人を実施しないことにより、メソッドを「選択的に実施する」ことができます。それは希望のようなものになります。

public class JustOne : BaseClass 
{ 
    public override void Method1() 
    { 
     // implement 
    } 

    public override void Method2() 
    { 
     throw new NotImplementedException(); 
    } 
} 

をしかし、これはあなたのオブジェクトは、彼らが意図的にサポートしていない機能を宣伝するだろうアンチパターンのものになるだろう。これはタイプBaseClassが非常に不安定/信頼できないとみなされるべきであることを意味します。なぜなら、そのタイプを消費するものが何であってもが実際に動作しなければならない方法がないからです。


最終的には、自分のタイプのコーナーに自分自身を描いたようで、少しバックアップして再考する必要があります。リスコフの代用を軽く取るべきではない。

+0

"悪い習慣"? :) – Fabio

+0

@ファビオ:それは素晴らしい選択肢です。 OPのシステムには、少なくとも短期間では必要な場合があります。私はむしろそれを記述し、単に「行うことはできない」と言っているだけでなく、OPが自分自身でそのオプションを見つけ、何か賢いものを発見したと思うよりも、それを使用しない理由を説明したいと思います。 – David

+0

オプションです。いくつかのメソッドが 'NotImplementedException'をスローするライブラリで作業する必要があるときにあなたの反応を想像してみてください。 – Fabio

1

これは方法に依存することを強制すべきではないクライアントは を使用していないインタフェースやクライアントを実装することを強制すべきではありませんSOLID原則の一つInterface segregation principle

の違反の基本的な例であります彼らはあなたがこの方法のいくつかは、あなたが分離抽象化でそれらを分割する必要がある唯一の必要な抽象化を持っている場合は

を使用しないで 。

.NETでは、クラスからの多重継承はサポートされていません。

コードを気にする人は、抽象クラスを分割した2つのクラスに分割するオプションが1つしかありません。

抽象化だけで作業する場合は、インターフェイスを複数のインターフェイスを1つのクラスに実装できるため、インターフェイスが優れています。

次に、両方のメソッドを必要とするクラスで両方のインターフェイスを実装できます。また、1つのメソッドが必要なクラスでは、1つのインタフェースのみを使用します。継承がどのように機能するかを実際にはありません1つの方法

public abstract class BaseClassOneMethod : IMethodOne 
{ 
    public abstract void Method1(); 
} 
関連する問題