28

プロキシオブジェクトでラップしたい(不十分に記述された)基本クラスがあります。基本クラスは次のようになります。

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   public BaseClass(int someValue) {}

   //...more code, not important here
}

そして、私のプロキシは次のようになります。

public BaseClassProxy : BaseClass
{
  public BaseClassProxy(bool fakeOut){}
}

「fakeOut」コンストラクターがない場合、基本コンストラクターが呼び出されることが期待されます。しかし、それで、私はそれが呼ばれないことを期待しました。いずれにせよ、基本クラスのコンストラクターを呼び出さない方法か、この(邪悪な)クラスを効果的にプロキシする他の方法が必要です。

4

13 に答える 13

65

インスタンスコンストラクタを呼び出さにオブジェクトを作成する方法があります。

先に進む前に、必ずこの方法で実行してください。99%の場合、これは間違った解決策です。

これがあなたのやり方です:

FormatterServices.GetUninitializedObject(typeof(MyClass));

オブジェクトのコンストラクターの代わりに呼び出します。コンストラクターやフィールド初期化子を呼び出さずにインスタンスを作成して返します。

WCFでオブジェクトを逆シリアル化すると、このメソッドを使用してオブジェクトが作成されます。これが発生すると、コンストラクターやフィールド初期化子でさえ実行されません。

于 2008-10-01T22:20:24.817 に答える
26

基本クラスでコンストラクターを明示的に呼び出さない場合、パラメーターなしのコンストラクターが暗黙的に呼び出されます。これを回避する方法はありません。コンストラクターを呼び出さずにクラスをインスタンス化することはできません。

于 2008-10-01T19:35:06.977 に答える
6

少なくとも 1 つの ctor を呼び出す必要があります。それを回避する唯一の方法は封じ込めです。クラスを他のクラスの内部または参照にします。

于 2008-10-01T19:34:52.080 に答える
5

2 つの基本クラス コンストラクターのいずれも呼び出さないことが必要な場合は、これを行うことはできません。

C# クラス コンストラクターは、基本クラス コンストラクターを呼び出す必要があります。明示的に呼び出さない場合、base( )は暗示されます。あなたの例では、呼び出す基本クラスのコンストラクターを指定しない場合、次と同じです。

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base() { }
}

他の基本クラス コンストラクターを使用する場合は、次を使用できます。

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base(someIntValue) { }
}

いずれにせよ、明示的または暗黙的に、2 つのうちの 1 つが呼び出されます。

于 2008-10-01T19:53:46.323 に答える
5

コンストラクターの呼び出しを回避できるとは思いません。しかし、次のようなことができます。

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   protected virtual void Setup()
   {
   }
}

public BaseClassProxy : BaseClass
{
   bool _fakeOut;
   protected BaseClassProxy(bool fakeOut)
   {
        _fakeOut = fakeOut;
        Setup();
   }

   public override void Setup()
   {
       if(_fakeOut)
       {
            base.Setup();
       }
       //Your other constructor code
   }
} 
于 2008-10-01T19:38:27.860 に答える
1

基本呼び出しコンストラクターがオプションではないことを残念に思います。

于 2008-10-01T19:35:12.547 に答える
1

BaseClassProxy オブジェクトを作成するときは、その基本クラスのインスタンスを作成する必要があるため、基本クラスのコンストラクターを呼び出す必要があります。次のように、呼び出すものを選択できます。

public BaseClassProxy (bool fakeOut) : base (10) {}

最初のコンストラクターの代わりに 2 番目のコンストラクターを呼び出すには

于 2008-10-01T19:35:32.857 に答える
0

私は最終的に次のようなことをしました:

public class BaseClassProxy : BaseClass 
{
   public BaseClass BaseClass { get; private set; }

   public virtual int MethodINeedToOverride(){}
   public virtual string PropertyINeedToOverride() { get; protected set; }
}

これにより、基本クラスの悪い慣行のいくつかを回避することができました。

于 2008-10-01T19:58:29.357 に答える
0

コンストラクターは本質的にパブリックです。コンストラクターを使用せず、別のコンストラクターを使用して構築し、それをプライベートにします。そのため、パラメーターなしでインスタンスを作成し、オブジェクト インスタンスを構築するためにその関数を呼び出します。

于 2011-11-21T11:37:24.410 に答える
0

よし、これはあるクラスが別のクラスのコンストラクターを継承するという問題に対する醜い解決策であり、それらの一部を動作させたくない。私は自分のクラスでこれを使用することを避けたいと思っていましたが、ここにあります:

ここに私のクラスコンストラクターがあります:

public MyClass();
{
   throw new Exception("Error: Must call constructor with parameters.");
}

さて、あなたはそれが醜いことを警告されました. 苦情はご遠慮ください!

パラメータなしで継承された基本コンストラクタを許可せずに、メインコンストラクタから少なくとも最小限のパラメータを強制したかったのです。

また、コンストラクターを作成し、その後に :base() を配置しないと、基本クラスのコンストラクターが呼び出されないと考えています。また、基本クラスのすべてのコンストラクターを作成し、メイン クラスでそれらにまったく同じパラメーターを指定すると、それは通過しません。しかし、基底クラスに多くのコンストラクターがある場合、これは面倒です!

于 2018-03-29T20:11:24.543 に答える