方法重写中的属性
本文关键字:属性 重写 方法 | 更新日期: 2023-09-27 18:08:31
我有一个带方法的基类。派生类只需要用一个属性(每个派生类都不同)修饰该方法,并保持主体不变。
我做了一些像
基类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();
。
有没有更清晰的方法来解决这类问题?我错过了什么明显的东西吗?
没有别的办法了。
关于…
"重复return base.Method();[…]也很乏味"
…我想说,Visual Studio会自动为您生成这些代码,这意味着它是值得的(覆盖以应用新属性)。
事实上,这是。net语言的一个核心设计决策,因为属性反射提供了方法Type.GetCustomAttributes(...)
,它有一个过载,接受一个名为inherit
的输入参数,参见其描述:
无论如何,我不认为这是一个不清楚的方法,因为属性是一个实现细节,这就是为什么你需要多态性来修饰一个继承的成员。继承类型:系统。布尔
true在成员的继承链中查找属性;否则,假的。对于属性,忽略此参数和事件[…]
也许你正在寻找这样的东西(我发明了新的c#语法!):
[AttributeA]
public metadataoverride int MethodA();
那么应该间接调用该方法。
创建一个包装器方法,该方法执行所有不应被覆盖的基本代码:
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 ???
}