0

ooデザインの基本はこちら...

編集:最初の答えの後で明確にするために-私はこれを修正する方法を尋ねていませんが、それの表面上でデザインが厄介に見えるかどうか。社会的配慮のために元のコードを指摘したくありません。

クラスのプライベートメンバー変数を変更するだけの仮想メソッドを持つコードを使用しています。その変更の詳細を変更したいだけです。変更したい動作はこれだけですが、プライベートメンバーを参照できないため、メソッドをオーバーライドすることはできません。表面的には、元の作者によるそのデザインは間違っている/奇妙なものですか、それともこれは言うのに十分な情報ではありませんか?

public class X
{
    private List<string> InterestingThings = new List<string>();

    public virtual void MethodIWantToOverride(string rawData)
    {

         string fixedData = ... 
         // do some fancy stuff to clean up data that I want to come thru 'dirty'
         InterestingThings.Add(fixedData);
    }
 }
4

3 に答える 3

3

メソッドで変更するのではprotectedなく、変数として定義する必要があります。privatevirtual

この変更をお勧めし、メソッドをそのままvirtualにしておくことをお勧めします。これにより、このクラスの外部で何も壊れないことが保証されます。元の開発者は、派生クラスで仮想メソッドをオーバーライドすることを意図していた可能性があります。これが事実であることを知る方法やテストする方法がない場合は、メソッドをそのままにして、メンバーを にvirtual変更します。privateprotected

仮想メソッドの詳細については、こちらをご覧ください

于 2012-06-12T15:14:44.673 に答える
0

コードの目的が、リストに追加されるアイテムに何らかの不変条件を適用することである場合、リストにアイテムを追加するすべての試みが仮想メソッドを通過することを要求することは、それを達成する方法です。リスト フィールドを公開するprotectedと、派生クラスが基本クラスの不変条件に違反する可能性があります。それがあなたがやろうとしていることであり、コードが実際に依存している不変条件のすべての部分を支持する場合は、リスト フィールドを作成protectedすることもできますが、少なくとも別の保護された可能性のある仮想フィールドを追加することを検討することをお勧めします。より弱い不変条件を維持する方法でそれを変更する基本クラス メソッド。

于 2012-06-12T18:46:20.950 に答える
0

プロパティをプライベートのままにしておくと、それを含むクラスだけがそれを見ることができます。protected に設定すると、派生クラスもそれを表示して使用できるようになります。上記のように、このプロパティへのアクセスを必要とするメソッドをオーバーライドするために派生クラスが必要な場合は、プロパティとメソッドを (少なくとも) 保護する必要があります。

于 2012-06-12T15:33:11.030 に答える