3

C# 4.0 .NET 4.5 Silverlight 5 解決策が見つからないのは奇妙に思えるので、助けが必要です。

基本クラス Base と派生クラス Child : Base があります。T : EntityObject である EF エンティティ ヘルパーの特定の作業を行うためのジェネリック型を持つヘルパー クラスもあります。

子は、特定のエンティティ MyEntity : EntityObject で特定の作業を行います。

だから私は試しました:

public class Base
{
    protected Helper<EntityObject> helper;
}
public class Child : Base
{
    public Child()
    {
        helper = new Helper<MyEntity>();
    }
}

より派生したクラスは、より具体的なジェネリックパラメーターについて知っている必要があると思いますが、それが共分散であると思います...しかし、それは機能しません...

そのようなクラスを設計する「正しい」方法は何ですか?

編集:申し訳ありませんが、必要なものを達成できない理由を100%明確にしませんでした。

を。Baseのユーザーは T 型を知らないため、一般的な Base を使用したソリューションは機能しません。想像:

public class User
{
    private Base<T> base; // this will not compile.
    public User(TypeEnum t)
    {
        if(t == TypeEnum.MyEntity) base = new Child();
...

b. ヘルパーはどこでも T を使用するため、インターフェイスを使用したソリューションは機能しません (それが目的ですよね?)。メソッドがあると想像してください

public IEnumerable<T> Process(IEnumerable<T> items) { return items; }

Tについて何も知らないインターフェースでそれを表示するにはどうすればよいですか

4

2 に答える 2

5

これがあなたが求めているものだと思います:

public class Base<T> where T : EntityObject
{
    protected Helper<T> helper;
}
public class Child : Base<MyEntity>
{
    public Child()
    {
        helper = new Helper<MyEntity>();
    }
}

編集 (編集に応じて): を追加してBase、次のように使用できます。

public class Base
{
    // put anything here that doesn't rely on the type of T
    // if you need things here that would rely on T, use EntityObject and have 
    // your subclasses provide new implementations using the more specific type
}
public class Base<T> : Base where T : EntityObject
{
    protected Helper<T> helper;
}
public class Child : Base<MyEntity>
{
    public Child()
    {
        helper = new Helper<MyEntity>();
    }
}
public class User
{
    private Base myBase;
    public User(TypeEnum t)
    {
        if(t == TypeEnum.MyEntity) myBase = new Child();
        ...
于 2013-05-01T11:51:40.570 に答える
4

Foo:の場合、それは:Barという意味ではありません。やりたいことをやるには2つの方法があります。1 つ目は、次のように基本型をジェネリックにすることです。Some<Foo>Some<Bar>

Base<T> where T : EntityObject {
    protected Helper<T> helper;
}
Child : Base<MyEntity> {...}

2 つ目は、基本型で非ジェネリック インターフェイスを使用することです。

Base {
    protected IHelper helper;
}
Child : Base {...}

後者の場合、定義されるHelper<T> : IHelper非ジェネリックの場合。IHelper

補足として、フィールドを使用するよりもコンストラクターで値を渡す方が簡単な場合がありprotectedます。

于 2013-05-01T11:53:11.857 に答える