При создании производного класса в C # возможно ли перезаписать виртуальную функцию с 0 параметрами с помощью функции с n параметрами? - PullRequest
1 голос
/ 21 сентября 2011

Я проверил MSDN и пару других сайтов, но я все еще не уверен, что получил ответ на этот вопрос.Если у вас есть родительский класс с виртуальной функцией Init (), могу ли я - в производном классе - иметь переопределенную функцию Init (int num) или вам просто нужно создать новую функцию для каждого производного класса, который вы делаете?Если я не ошибаюсь, последнее заставит вас иметь 2 функции Init в классе Child, верно?Вот что я имею в виду:

    public class Parent {
        protected int a;

        public Parent() {
            a=1;
        }

        public virtual void Init() {
        }
    }

    public class Child : Parent {

        public Child() {
        }

        //is this allowed?
        public override void Init(int multiplier) {
        }

        //or do i have to do this and have 2 Init functions?
        public void Init(int multiplier) {
        }
    }

Ответы [ 5 ]

5 голосов
/ 21 сентября 2011

Вы на самом деле не переопределяете метод, вы просто определяете новую перегрузку.

Чтобы иметь возможность переопределить метод, базовый метод должен быть объявлен как public (или protected) * virtual (или abstract) метод и ваш производный класс должны использовать одну и ту же сигнатуру.

В вашем случае в базовом классе не существует переопределяемого метода с этой сигнатурой, поэтому он не разрешен. будет разрешено, если существует перезаписываемый метод с подписью Init(int), но его нет, компилятор выдаст здесь ошибку.

0 голосов
/ 21 сентября 2011

Компилятор выдаст вам ошибку, потому что "нечего переопределять".

По сути, переопределенный метод должен соответствовать базовой сигнатуре:

http://msdn.microsoft.com/en-us/library/ms173153.aspx

0 голосов
/ 21 сентября 2011
    //is this allowed?
    public override void Init(int multiplier) {
    }

Это не переопределение.

Поскольку вы вводите новый множитель, он будет считаться новым методом.

Однако, если вы это сделаете.

      public override void Init(){}

Будет отменено.

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

       public void Init(int Multiplier)
       {}  
0 голосов
/ 21 сентября 2011

Переопределение должно иметь одинаковую подпись, иначе нет смысла делать его виртуальным.

0 голосов
/ 21 сентября 2011

Это невозможно.
Каким будет параметр, если он вызывается из базового класса?

...