方法覆盖中的属性

时间:2014-06-13 06:22:15

标签: c# override

我有一个带有方法的基类。派生类只需要使用属性(每个派生类不同)来装饰该方法,并保持身体不变。

我做了类似

的事情

基础课程

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();也很乏味。

有没有更清洁的方法来解决这类问题?我错过了一些明显的东西吗

2 个答案:

答案 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();