2017-07-20 25 views
0

によってオーバーライドすることができない私は、その後基底クラスの仮想メソッドを実装

public class BaseClass 
{ 
    public virtual bool StartUpdate(Interface) 
    { some code here } 
} 

を定義する基本クラスを有する由来のインタフェース

public ClientClass : Interface {} 

を実装するクラスを有しますクラス

public class DerivedClass : BaseClass 
{ 
    public override bool StartUpdate(ClientClass) 
    { some code... } 
} 

コンパイラ(C#)はDerivedClassにエラーが発生し、適切でないことを示しますオーバーライドのメソッドが見つかりました。 私は間違ったやり方をしていますか?なぜコンパイラはを実装しているのですか?ClientClass

ご協力いただければ幸いです。

EDIT:

派生クラス

public override bool StartUpdate(object o) 
{ 
    // o will always implement Interface 
} 

It'sa混乱におけるベースクラス

public virtual bool StartUpdate(object o) 
{ 
    checkInterface(o); // if not o is Interface, throws an exception 
    more code... 
} 

において "溶液"

を発見したが、双方向のC#それが好きです。

+0

あなたは、なぜ適切なメソッドのシグネチャで –

+0

を実際のコードを提供してください具体的な 'ClientClass'が' interface'ではなくパラメータになる必要がありますか? – Tigran

+0

@marcelo - そのような 'object'を使うのはなぜですか?あなたは特定のオブジェクト/インターフェースを持つすべての力を失いました....これはコンパイルされますが、確かに "C#が好きな"方法ではありません....あなたは以下の答えを見てきましたか? –

答えて

1

あなたの基底クラスのメソッドのシグネチャは次のとおりです。

public virtual bool StartUpdate(Interface obj) { } 

しかし、あなたの派生クラスで、あなたが書いた:

public override bool StartUpdate(ClientClass obj) { } 

ClientClassが、それは同じタイプではありませんInterface実装していますが。派生クラスのメソッドの署名はInterfaceである必要があります。 MSDNでの仕様から:

オーバーライドされる基本メソッドはオーバーライドメソッドと同じシグネチャを持つ必要があります


あなたが導出方法が異なる、コンクリート、型がgenericsを検討したい場合は:

public class BaseClass<T> where T : Interface 
{ 
    public virtual bool StartUpdate(T data) { /*code here*/ } 
} 

public class Derived : BaseClass<ClientClass> 
{ 
    public override bool StartUpdate(ClientClass data) { /*code here*/ } 
} 
+0

私はもちろん、一般的なアプローチを試みました。しかし、その基本クラスは、ジェネリックを使用できないことが証明された別の基本クラス(私の質問には示されていません)とのやりとりがたくさんあります。 MVPパターン(またはそのようなもの)を実装しようとしているので、BasePresenter(私が示したクラス)とBaseView(フォームのサブクラス)を開発しました。しかし、私はジェネリック薬で迷ってしまった。ありがとうございました。 – marcelo

+0

あなたは大歓迎です:)あなたはクラスが大きなものであるように聞こえます。適切なインターフェイスと構成で小さな単位に分割します。その後、必要に応じてジェネリックを使用します。この答えでは、インターフェイスを実装していないという質問自体については、理由と解決策があります(遺伝学に言及する前でも)。 –

+0

悲しいことに、フォーム派生クラスは、ソース)。 BasePresenterクラスはそれほど大きくありません。しかし、BaseViewはやや複雑です。それがジェネリック医薬品を放棄する理由でした。 – marcelo

0

メソッドの範囲を縮小しながらオーバーライドすることはできません上書きする。すべてのタイプのインタフェースを受け入れる必要があります。それ以外の場合は、許可されていない基本クラスの機能が縮小されます。だから、書く必要があります。

public override bool StartUpdate(Interface obj) 

をこれは、これはあなたが探しているものと思われるLiskov substition principle

+0

オーバーライドされたメソッドでそのインターフェイスを使用することはほとんど役に立ちません。基本クラスで処理できるすべてのクラスにインターフェイスを実装する必要があるため、インターフェイスを定義するメソッドが必要です。上記のGiladへの私のコメントを見てください。 – marcelo

1

と呼ばれている:

public class BaseClass<T> where T: Interface 
{ 
    public virtual bool StartUpdate(T input) 
    { 
     // return whatever 
    } 
} 

public class DerivedClass : BaseClass<ClientClass> 
{ 
    public override bool StartUpdate(ClientClass input) 
    { 
     // return whatever 
    } 
} 
関連する問題