我在基类中有这个:
protected abstract XmlDocument CreateRequestXML();
我尝试在派生类中覆盖它:
protected override XmlDocument CreateRequestXML(int somevalue)
{
...rest of code
}
我知道这是一个简单的问题,但因为我引入了一个问题就是这个问题?问题是,某些派生类在其实现中可能有也可能没有params。
答案 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)
我非常好奇您使用此代码尝试完成的任务。
通常在使用类知道其签名时定义抽象函数。用法类与您的基类有“契约”。
当您想从基类派生并添加其他参数时,使用类如何知道在基类上调用什么?
它看起来像是一个架构上的缺陷....但也许你可以在初始主题中添加一些额外的信息。