如何覆盖基类方法并添加参数

时间:2009-03-11 04:32:45

标签: c# architecture

我在基类中有这个:

protected abstract XmlDocument CreateRequestXML();

我尝试在派生类中覆盖它:

protected override XmlDocument CreateRequestXML(int somevalue)
{
    ...rest of code
}

我知道这是一个简单的问题,但因为我引入了一个问题就是这个问题?问题是,某些派生类在其实现中可能有也可能没有params。

4 个答案:

答案 0 :(得分:12)

当覆盖方法时,除了替换virtual或abstract之外,它必须具有与原始方法完全相同的签名。

您在此处所做的是创建一种新的无关方法。无法引入参数并仍然覆盖。

答案 1 :(得分:2)

如果某些派生类需要参数而某些派生类不需要,则需要有两个重载版本的方法。然后每个派生类都可以覆盖它所需的类。

class Foo {    
    protected abstract XmlDocument CreateRequestXML(int somevalue);
    protected abstract XmlDocument CreateRequestXML();
};

class Bar : public Foo {    
    protected override XmlDocument CreateRequestXML(int somevalue) { ... };
    protected override XmlDocument CreateRequestXML()
        { CreateRequestXML(defaultInt); }
};

这当然会引入用户呼叫错误的问题。如果额外参数没有可接受的默认值,如果调用了错误的版本,则可能必须在派生类中抛出异常。

答案 2 :(得分:0)

是参数是问题,方法签名必须完全匹配(包括返回值和参数)。

答案 3 :(得分:0)

我非常好奇您使用此代码尝试完成的任务。

通常在使用类知道其签名时定义抽象函数。用法类与您的基类有“契约”。

当您想从基类派生并添加其他参数时,使用类如何知道在基类上调用什么?

它看起来像是一个架构上的缺陷....但也许你可以在初始主题中添加一些额外的信息。