我有一个带有方法的基类。派生类只需要使用属性(每个派生类不同)来装饰该方法,并保持身体不变。
我做了类似
的事情基础课程
public virtual int Method1()
{
// body
}
public virtual int Method2()
{
// body
}
派生类A
[AttributeA(ParameterName = "AName", CommandName = "ACommand")]
public override int Method1()
{
return base.Method1();
}
[AttributeA(ParameterName = "AnotherName", CommandName = "AnotherCommand")]
public override int Method2()
{
return base.Method2();
}
派生类B
[AttributeB(ParameterName = "BName", CommandName = "BCommand")]
public override int Method1()
{
return base.Method1();
}
[AttributeB(ParameterName = "BnotherName", CommandName = "BnotherCommand")]
public override int Method2()
{
return base.Method2();
}
并且它有效,但它对我来说似乎并不陌生,主要原因是它让客户端可以自由地覆盖方法的主体,这是我宁愿避免的,而且它是&#重复return base.Method();
也很乏味。
有没有更清洁的方法来解决这类问题?我错过了一些明显的东西吗
答案 0 :(得分:0)
然后你应该间接调用这个方法 创建一个包装器方法,该方法执行不应覆盖的所有基本代码:
private int MethodInternal() {
// do common stuff here
// original body of Method()
return Method();
}
基类中Method()
的主体是空的,只是为了注入代码的可能性。
这使得return base.Method()
在被解除的类中的调用变得不必要。
示例:强>
基类
public virtual int Method()
{
// empty
}
派生类A
[AttributeA]
public override int Method()
{
// no return base.Method() required
return ???
}
答案 1 :(得分:0)
没有其他办法可以做到这一点。
信息......
"重复返回base也很乏味。方法(); [...]"
...我想说Visual Studio会为您自动生成此代码,这意味着它值得付出努力(覆盖应用新属性)。
实际上,它是.NET语言的核心设计决策,因为对属性的反射提供了方法Type.GetCustomAttributes(...)
,并且它有一个重载,它接受一个名为inherit
的输入参数并查看其描述:
继承 键入:System.Boolean
如果要搜索此成员的继承链以查找属性,则为true;否则,错误。属性将忽略此参数 和事件[...]
无论如何,我没有发现不清楚这样做的方式,因为属性是一个实现细节,这就是为什么你需要多态来装饰一个继承的成员。
也许您正在寻找类似的东西(我发明了新的C#语法!):
[AttributeA]
public metadataoverride int MethodA();