Переопределение метода подкласса Java - PullRequest
1 голос
/ 20 ноября 2011

Я почти уверен, что у меня есть право переопределения Inheritance, но я надеялся на подтверждение:

class C1 {
    public int relation( C1 MyC2 ){
        //Do stuff
    }
}

class C2 extends C1{
    public int relation( C2 MyC2){
        //Do stuff
        return super.relation((C1) MyC2);
    }
}

Насколько я понимаю, C2 # отношением () на самом деле не переопределяет отношение C1 #, и поэтомувсе следующие утверждения являются законными:

MyC1_1.relation(MyC1_2); //Calls C1#relation()
MyC2_1.relation(MyC1_1); //Calls C1#relation()
MyC2_1.relation(MyC2_2); //Calls C2#relation()

Хотя следующее ошибочно

MyC1_1.relation(MyC2_1);

Если я прав, то отлично.В противном случае, я хотел бы знать, почему ...

Ответы [ 3 ]

6 голосов
/ 20 ноября 2011

Чтобы переопределить метод, он должен иметь сигнатуру, которая является подписью подписи переопределенного метода.Согласно Спецификации языка Java:

Подпись метода m1 является подписью для подписи метода m2, если либо:

  • m2 имеет такую ​​же подпись, что и m1или
  • подпись m1 совпадает с удалением подписи m2.

Это в основном означает, что методы должны иметь одинаковые имя и аргументы (итакже с учетом стирания типа).

Поэтому в вашем случае relation(C1 c1) нельзя переопределить на relation(C2 c2).Это означает, что класс C1 имеет только первый метод, а C2 имеет оба.Вот почему ваши предположения абсолютно верны, за исключением последнего (MyC1_1.relation(MyC2_1)), что также является правильным утверждением.C2 является подклассом C1, и поэтому C2 может использоваться везде, где может C1.

1 голос
/ 20 ноября 2011

Все методы верны:

Поскольку это НЕ переопределение, это перегрузка

«отношение public int (C1 MyC2)» не будет переопределено «отношением public int (C2 MyC2)».

Вы можете просто добавить @override выше "public int Relations (C2 MyC2)"

0 голосов
/ 20 ноября 2011

Я бы сказал, что вторая инструкция из первой партии:

MyC2_1.relation(MyC1_1); //Calls C1#relation()

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

Это так, потому что C2на больше, чем С1 (у него есть все, что есть у С1, плюс что-то большее), потому что это extends С1 - так что везде, где вы ожидаете С1, с С2 тоже будет все в порядке.

Между тем, С1 на меньше, чем С2, для «возврата» по вышеуказанной причине, поэтому, когда ожидается С2, С1 будет недостаточно.

...