Как переопределить метод базового класса и добавить параметр - PullRequest
6 голосов
/ 11 марта 2009

У меня есть это в моем базовом классе:

protected abstract XmlDocument CreateRequestXML();

Я пытаюсь переопределить это в своем производном классе:

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

Я знаю, что это простой вопрос, но поскольку я ввел параметр, это проблема? Дело в том, что некоторые из производных классов могут иметь или не иметь параметры в своей реализации.

Ответы [ 4 ]

12 голосов
/ 11 марта 2009

Когда вы переопределяете метод, за исключением слова переопределения вместо виртуального или абстрактного, он должен иметь точно такую ​​же сигнатуру, что и оригинальный метод.

То, что вы сделали здесь, - это создали новый не связанный метод. Невозможно ввести параметр и переопределить его.

2 голосов
/ 11 марта 2009

Если некоторые из производных классов нуждаются в параметрах, а некоторые - нет, вам необходимо иметь две перегруженные версии метода. Тогда каждый производный класс может переопределить тот, который ему нужен.

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); }
};

Это, конечно, создает проблему, когда пользователь вызывает неправильный адрес. Если для дополнительного параметра не существует приемлемого значения по умолчанию, вам может потребоваться создать исключение в производном классе, если вызывается неправильная версия.

0 голосов
/ 11 марта 2009

Мне очень любопытно, что вы пытаетесь сделать с помощью этого кода.

Обычно вы определяете абстрактную функцию, когда класс использования знает свою сигнатуру. У класса использования есть «контракт» с вашим базовым классом.

Если вы хотите извлечь из базового класса и добавить дополнительные параметры, как класс использования знает, что вызывать базовый класс?

Это похоже на архитектурный недостаток .... но, может быть, вы можете добавить дополнительную информацию в начальную тему.

0 голосов
/ 11 марта 2009

Да, параметр является проблемой, подпись метода должна точно совпадать (включая возвращаемое значение и параметры).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...