これは不可能です。
私の意見では、ラッパーは継承を使用して実装する必要はないと思います。
たとえば、Engine
クラスがあり、を実装する必要があるとしますFerrariEngine
。そして、あなたはCar
クラスを持っています。
あなたはそれCar
が継承するべきだと言っていますFerrariEngine
。それは私にはひどいようです!
結局のところ、継承を使用した依存性注入のようなことをしようとしていますが、これも正しい方法ではありません。
私の提案は、あなたの生活を楽にしようとしないことです。合理的なポイントに基づいてアーキテクチャを決定します。
アップデート
OPはいくつかのコメントで言った:
このクラスでタイプTのオブジェクトのインスタンスを管理できるようにしたいので、インスタンスを作成する必要があるときにクライアントが処理する必要はありません。
あなたが望むものを得るために奇妙なものを作る必要はありません:
public interface IEngine
{
void Start();
}
public sealed class FerrariEngine : IEngine
{
public FerrariEngine()
{
Start();
}
public void Start()
{
}
}
public abstract class Car<TEngine> where TEngine: IEngine, new()
{
public Car()
{
_engine = new Lazy<TEngine>(() => new TEngine());
}
private readonly Lazy<TEngine> _engine;
public TEngine Engine
{
get { return _engine.Value; }
}
}
public class FerrariCar : Car<FerrariEngine>
{
}
最後に、次のインスタンスを作成するとFerrariCar
:
Car<FerrariEngine> myFerrari = new FerrariCar();
開発者の介入なしに、エンジンがインスタンス化されて起動されます。
Lazy<T>
基本的なジェネリック制約がどのように仕事をするかを確認してください;)
要約すれば:
- エンジンの使用
Lazy<T>
は、一部のユーザーがプロパティにアクセスした場合にのみインスタンス化されEngine
ます。
- 遅延ロードされたエンジンがインスタンス化されると、それ自体を
FerrariEngine
呼び出すパラメーターなしのコンストラクターが実装されるため、エンジンが起動します。Start()
このサンプルは、探しているものを取得し、C#を「そのまま」使用する方法を示していると思います。