の派生コンストラクタを実行するここで問題となるのは、派生クラスにオブジェクトを渡したいのですが、ベースクラスが直ちに派生クラスを呼び出すため、そのオブジェクトを使用するクラスのStart()
メソッドです。基本コンストラクタの前にC#
ここでは、基本クラスの抜粋(便宜上、BarcodeScannerに改名)です。
public abstract class MyBase
{
public MyBase()
{
if (Initialize())
this.Start();
}
public abstract bool Initialize();
public abstract void Start();
}
私が作成している派生クラスは次のとおりです。
class MyDerived : MyBase
{
private string sampleObject;
public MyDerived (string initObject)
{
sampleObject = initObject;
}
public override bool Initialize()
{
return GetDevice();
}
public override void Start()
{
Console.WriteLine("Processing " + sampleObject.ToString());
}
}
基本コンストラクタの前に派生したコンストラクタをC#で実行させることはできません。オブジェクトを使用する前に派生クラスにオブジェクトを渡すためのソリューションを探しています。
MyDerived
コンストラクタの中にInitialize/Start ifブロックを置いて、この問題を回避しました。しかし、基底クラスから派生する他のクラスがあります。私は、この派生クラスごとにInitialize/Startコードブロックを繰り返す必要がありました。私はベースクラスを変更する代わりに参照したいと思います。
さて、空のオーバーライドInitialize/Startメソッドを作成し、それらのコードをderivedInitialize/derivedStartメソッドに移動し、派生コンストラクタでif(derivedInitialize())derivedStart()を呼び出してください。洗練されたソリューションはないかもしれませんが、まだ他の方法があります。 – James
フレームワークが不完全に構築されたオブジェクトのエクスポーズを防止しようとすることはしばしば良いことですが、クラスがそのようなオブジェクトにアクセスすることがより有用な場合があります。部分的に構成されたオブジェクトを使用します。例えば、クラスが自身のライフタイムと一致する 'IDisposable'オブジェクトをカプセル化する場合は、フィールドイニシャライザを使用して設定すると便利です。 C#で悲しいことに、安全にそれを行うためのきれいな方法はありません。基本クラスのコンストラクタがスローすると、処分が必要なものへの参照を取得することはできません。 – supercat