如何在泛型类中隐式实现方法,派生自抽象类

本文关键字:方法 派生 抽象类 实现 泛型类 | 更新日期: 2023-09-27 18:18:54

我试图有一个实现泛型类的类列表,并能够通过抽象基访问GenericClass的一些成员。这是我现在的位置:

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。我知道我可以有一个抽象属性和一个实现,或者实现和new修饰符在派生属性。这两种情况都不适合。

我想要的例子:

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

如何在泛型类中隐式实现方法,派生自抽象类

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<ActionableWrapper>而不是使用泛型,你可以只使用一个接口,使它简单的List<IActionable>

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.

使用Linq你可以很容易地做到这一点(使用你的例子):

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

是否可以重新设计AbstractParent以要求ActionType:

public abstract class AbstractParent<ActionType>
{
    public abstract Action<ActionType> Action { get; set; }
}
如果需要的话,你继承的类可以重写
public override Action<ActionType> Action

另一种方法是让ActionType实现一个新的接口,比如IActionType。基类的返回属性将是接口,这不必在继承的类中被重写。

下面是完整的类/接口结构:
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;
        }
    }
}