に依存:一般的な実装が、コンストラクタの引数は、私は、同じタイプの新しいオブジェクトを作成する必要があり、具体的なクラスにジェネリッククラスで
public abstract class ViewModel<TPrimaryModel>
{
public void DoSomething()
{
...
ViewModel<TPrimaryModel> newViewModel = new TPrimaryModel(someArguments);
}
}
のC#でサポートされていないこれを行います。だから私はCreateInstance
-methodを導入することを決定した:
public abstract class ViewModel<TPrimaryModel>
{
public void DoSomething()
{
...
ViewModel<TPrimaryModel> newViewModel = CreateInstance(someArguments);
}
protected abstract ViewModel<TPrimaryModel> CreateInstance(Object someArguments);
}
public class UserViewModel : ViewModel<User>
{
public UserViewModel(Object someArguments)
{
...
}
protected override ViewModel<TPrimaryModel> CreateInstance(Object someArguments)
{
return new UserViewModel(someArguments);
}
}
渡されなければならなパラメータ(一部Service
-classes)はクラス変数です。残念ながら、ViewModel
にはいくつかのサービスが必要です。 例: ViewModelA viewModelA = new ViewModelA(serviceA, 5, "ViewModelA");
ViewModelB viewModelB = new ViewModelB(serviceB, serviceA, 6, "ViewModelB");
私が行くための正しい方法は何だろうか。オブジェクト作成の引数をカプセル化しますか?ファクトリーパターン?あるいは、そのような状況で継承を避け、構成に固執すべきですか?
私はいつも "すべての"サービスを渡すこともできます。または、すべてのサービスへのアクセスを提供するクラスを提供する。しかし、私はそれらが悪い考えだと思います。
「DoSomething」はどこから引数を取得するのですか?確かにそれ自体で問題があります...情報がどのように流れるかについてもう少し説明すれば助けになります。 –
'DoSomething()'抽象化を行い、その機能を保護されたメソッドに分割することは可能でしょうか? –
@JonSkeetそれは私が見る限り、クラス変数を渡すだけです。だから、これは問題ではありません。 – mosquito87