如何在泛型类中隐式实现方法,派生自抽象类
本文关键字:方法 派生 抽象类 实现 泛型类 | 更新日期: 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;
}
}
}