0

長くなりすぎたクラスAがあります。そこで、その機能の一部をクラスBに移動することにしました。BをAから継承させました。

これで、Aに関数があり、Bの関数が必要です。私の質問は、クラスAのクラスBをどこでインスタンス化する必要があるかです。クラスBは基本クラスを呼び出して無限ループを作成するため、クラスAコンストラクターでインスタンス化できません。

クラスAコンストラクターには、一度だけ初期化するオブジェクトがあるため、クラスBを一度だけインスタンス化する必要があります。

私が今意味をなしているかどうかさえわかりません。

4

5 に答える 5

4

継承はひどく酷使されています。特にあなたの場合、継承よりもコンポジションを優先したい。

于 2012-06-14T13:38:29.083 に答える
3

baseキーワードを使用すると、スーパークラス(baseclass)にアクセスできます:http://msdn.microsoft.com/en-us/library/hfw7t1ce(v = vs.71).aspx

ただし、クラスの長さが唯一の懸念事項である場合は、部分的なクラスを使用する方がよい場合があります(http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.80).aspx)。クラスを複数のファイルに分割できます。明らかに、あなたが今していることは、継承の意図と意味ではありません。

于 2012-06-14T13:39:56.550 に答える
1

まず、クラスが長くなりすぎたときに新しいクラスを定義するのはベストプラクティスではありません。すべての機能が論理的に同じオブジェクトに関連している場合は、それがどれだけ長くても同じクラスに保持できます。

Bを一度だけインスタンス化する場合は、静的クラスにする必要があります。静的クラスの詳細については、http: //msdn.microsoft.com/en-us/library/79b3xss3 (v = vs.80).aspxを参照してください。

于 2012-06-14T13:39:05.947 に答える
1

で関数を抽象化する場合A(これも抽象化する必要があります)、通常どおりにのAメソッドからそれらのメソッドを呼び出すだけです。次に、必要なロジックAで抽象関数をオーバーライドします。Bユーザーがクラスをインスタンス化すると、インスタンスを保持している変数のコンパイル時の型がである場合でも、Bこれらの呼び出しは呼び出しに変換されます。BA

于 2012-06-14T13:39:57.273 に答える
1

真の「is-a」関係がある場合にのみ、継承を使用する必要があります。私には、クラスBに必要な機能を説明しているように思えます。おそらくBはAを「持っている」ので、継承ではなく構成を検討する必要があります。

public class B
{
    private A a;

    public B(A a)
    {
       this.a = a;
    }

    public void UseAFunction()
    {
        a.MyFunction();
    }
}
于 2012-06-14T13:40:13.997 に答える