方法重写中的属性

本文关键字:属性 重写 方法 | 更新日期: 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 ???
}