1

(プロキシ設定を除く!)

基本クラスでの初期化は、そうではない継承クラスからのデータに依存していたため、ほとんどすべてのプロパティゲッターで条件付き初期化を実行するクラスの問題のより良いパターンに関する質問をここに書くのに時間を費やしました建設で入手可能。

質問を書いているときに、継承者の構築を初期化する方が良いという結論に達しました。これには、すべての継承クラスが親の初期化メソッドを呼び出す必要がありますが、次の理由から、そのほうがよいと思います。

  1. すべての新しいプロパティ getter/setter の基本クラスで初期化することを覚えておく必要はありません。
  2. デバッグ中に誤って初期化をトリガーすることはありません (ここで私の質問を参照してください)

プロパティ ゲッターで状態を変更するコードを使用したことがある場合、それは絶対に正当化できると思いますか? そのような場合の例を挙げていただけますか?(または、パターンを説明することさえできますか?)

プロパティアクセスまで初期化を実行したくないプロキシアクセスしか考えられませんでした...


ファクトリ/静的メソッドを使用して初期化することを誰かが提案しました-それは実際には良い考えです(構造が単純な場合、継承するクラス間で均一でない場合は少し難しいです)が、返信を送信する前に回答が削除されました. 残念な。

4

1 に答える 1

4

遅延キャッシング。プロパティにアクセスするまで、データベースからデータをロードしない場所。(これがプロキシアクセスの意味かどうかはわかりません)。

ただし、クラスの動作はアクセスの前後で同じままであるため、これがオブジェクトの状態を論理的に変更しているとは本当に考えていません。データは常に暗黙的に存在します。論理状態は変更されません。

直感に反し、論理的に正しくないため、ゲッターを介してクラスの論理状態を変更することは決してありません。あなたはあらゆる種類の意図しない結果の危険を冒します..

次のようなことができます:

    public class baseone
    {
        private baseone ()
        {
        }

        public baseone ( string huh )
        {
                initialise(huh);
        }

            protected abstract initialise(string stuff); 
    }


    public class niceone : baseone
    {
        public niceone (string param)
         : base(param)
        {

        }

            protected override initialise(string stuff)
            {
               // do stuff..
            }
    }

基本クラスの既定のコンストラクターをプライベートにすることで、クラスを初期化するために必要なパラメーターを渡す必要があることが保証されます。

于 2009-11-19T09:02:34.083 に答える