2011-12-26 5 views
3

私は、ジェネリッククラスを実装するクラスのリストを持っていて、抽象ベースを通じてGenericClassのいくつかのメンバーにアクセスできるようにしようとしています。私は現時点では午前場所です:abstractから派生したジェネリッククラスのメソッドを暗黙的に実装するにはどうすればよいですか?

public abstract class AbstractParent: UserControl 
{ 
    public abstract AAction Action { get; set; } 
} 

public abstract class GenericBase<ActionType> : AbstractParent 
{ 
    protected ActionType _action; 

    new public ActionType Action 
    { 
     set { _action = value; } 
     get { return _action; } 
    } 
} 

GenericBase <>インスタンスのリストを持っているために、私はList<AbstractParent>

を使用し、問題は、私はgenericTypeのパブリックプロパティが(合格したいということですGenericBaseの派生クラスによって)。

現時点のエラーはAction hides inherited abstract member Action.getです。 私は、派生したプロパティにabstract proprtyと実装、または実装とnew修飾子を持つことができます。どちらもこの状況に適合しません。私が何をしたいの

例:必要であれば、あなたの継承されたクラスは、オーバーライドすることができ

public abstract class AbstractParent<ActionType> 
{ 
    public abstract Action<ActionType> Action { get; set; } 
} 

public override Action<ActionType> Action 

GenericBase<BlueAction> blueClass; 
blueClass.Action <- I want this member to be of BlueAction type 
+0

かなり確信して、あなたがすることはできません。それを引き出すためには2レベルの派生型が必要です。(オーバーライドの場合は1つ、 'new'の場合は1つ) –

+0

@MarcGravellの回避策はありますか? – Odys

+1

XYの問題のように聞こえます。なぜそれをする必要がありますか? http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

答えて

2
public interface IActionable 
{ 
    public ActionType Action { get; } 
} 

public class ActionableWrapper : IActionable 
{ 

    private ActionType _action; 

    public ActionableWrapper(IActionable Actionable) 
    { 
    this._action = Actionable; 
    } 

    new public ActionType Action 
    { 
    get { return _action; } 
    } 
} 

public class BlueAction: IActionable 
{ 
    public ActionType Action { get; } 
} 

これは、ジェネリックを使用していない許可され、あなたが欲しいものを行います。ジェネリックを使用する代わりに、インターフェイスを使用して簡単にList<IActionable>にすることができるのは、List<ActionableWrapper>が欲しい理由がわからないからです。あなたは(あなたの例を使用して)とにかく簡単にこれを行うことができますLINQのを使用して

I am trying to have a List of classes that implement a generic class and be able to access some members of the GenericClass through the abstract base.

List<AbstractParent> AbstractParentCollection = new List<AbstractParent>(); 
GenericBase<BlueAction> blueClass;  
AbstractParentCollection.Add(blueClass); 
AbStractParentCollection.Typeof(GenericBase<BlueAction>).First().Action... 
1

があなたのAbstractParentがACTIONTYPEを必要とするように再設計することができます更新

代わりに、ActionTypeにIActionTypeなどの新しいインターフェイスを実装させることもできます。基本クラスからのreturnプロパティはインターフェイスであり、これは必ずしも継承されたクラスでオーバーライドする必要はありません。ここで

は完全なクラス/インタフェース構造である:

public interface IAction 
{ 
} 

public abstract class AbstractParent 
{ 
    public abstract IAction Action { get; set; } 
} 

public abstract class GenericBase<T> : AbstractParent where T : IAction 
{ 
    protected IAction _action; 

    public override IAction Action 
    { 
     get 
     { 
      return _action; 
     } 
     set 
     { 
      _action = value; 
     } 
    } 
} 
+0

しかし、私はそれらのオブジェクトのリストを持つことはできません。 'List 'を使って 'GenericBase'インスタンスを保持していました。 'GenericBase'のメンバーにアクセスするためにこれを作った – Odys

+0

クラスの代わりにActionの値のためにInterfaceを使うのはどうですか? –

+0

私は、AbstractBaseが明瞭にするためにUserControlから継承していないことを除いていました。 – Odys

関連する問題