2009-03-11 15 views
5

が、私はこれを持っているパラメータを追加しますどのように基底クラスのメソッドをオーバーライドして、私の基本クラスで

protected override XmlDocument CreateRequestXML(int somevalue) 
{ 
    ...rest of code 
} 

を、私は、これは知っている:私は私の派生クラスでこのメソッドをオーバーライドしてみ

protected abstract XmlDocument CreateRequestXML(); 

簡単な質問ですが、私はparamを導入したので、それは問題ですか?つまり、派生したクラスの中には、その実装にparamsがある場合とない場合があります。

答えて

11

メソッドをオーバーライドするときは、virtualまたはabstractの代わりにoverrideという単語を除いて、元のメソッドとまったく同じシグネチャを持つ必要があります。

あなたがここで行ったことは、新しい無関係の方法を作成することです。パラメータを導入しても上書きすることはできません。

+0

これで、すべてのクラスがこの基本クラスを継承して、そのメソッドを実装する必要があることを確認したいとします。しかし、その中には、そのメソッドに必要なパラメタがいくつかあり、そうでないものもいくつかあることがわかります。じゃあ何? paramsを必要とせず、privフィールド経由で取得しますか? – user72603

+0

したがって、サブクラスが、必要に応じてparamsを必要とするサブクラスで保護されたメソッド&を実装するようにしたい場合は、サブクラスが依存している場合とそうでない場合があるためです。メソッドが一般的に消費されることを意図していない場合は、クラスのプライベートメンバーから取得することができます...それは典型的ですか? – user72603

+1

私は、保護されたメソッドまたはパラメータを持たないプライベートメソッドを残して、プライベートフィールドから必要なものを取得するのが最善の場合(ベストプラクティス)を理解しようとしています – user72603

0

はい、パラメータが問題であり、メソッドのシグネチャが正確に一致する必要があります(戻り値とパラメータを含む)。

2

派生クラスの中にはパラメータが必要なものもあれば、そうでないものもありますが、メソッドのオーバーロードされたバージョンは2つ必要です。次に、それぞれの派生クラスは必要なクラスをオーバーライドできます。

class Foo {  
    protected abstract XmlDocument CreateRequestXML(int somevalue); 
    protected abstract XmlDocument CreateRequestXML(); 
}; 

class Bar : public Foo {  
    protected override XmlDocument CreateRequestXML(int somevalue) { ... }; 
    protected override XmlDocument CreateRequestXML() 
     { CreateRequestXML(defaultInt); } 
}; 

もちろん、間違ったものを呼び出すという問題があります。余分なパラメータに許容されるデフォルト値がない場合、間違ったバージョンが呼び出された場合、派生クラスに例外をスローする必要があります。

0

このコードで達成しようとしていることは非常に興味があります。

通常、使用クラスがその署名を知っている場合、抽象関数を定義します。使用クラスは基本クラスとの "契約"を持っています。

ベースクラスから派生し、追加のパラメータを追加する場合、使用クラスは基本クラスで何を呼び出すべきかをどのように知っていますか?

これはアーキテクチャ上の欠陥のようですが、おそらくあなたはいくつかの追加情報を最初のトピックに追加できます。