Различные языки (например, C++, Java или C#) имеют очень разные правила разрешения перегрузки. В C# перегрузка была правильно выбрана в соответствии с спецификацией языка. Если вы хотите, чтобы другая перегрузка была выбрана, у вас есть выбор. Помните:
Когда производный класс намерен объявить другую перегрузку наследуемого метода, с тем, чтобы рассматривать все доступные перегрузки как сверстники равноапостольных прав, он должен также явно переопределить все наследуемые перегруженные с базовым вызовом как Что ж.
Что такое языковой дизайн, требующий этого упражнения?
Представьте, что вы используете стороннюю библиотеку (скажем, платформу .NET) и выходите из одного из ее классов. В какой-то момент вы вводите частный метод под названием Abc
(новое, уникальное имя, а не перегрузка чего-либо). Через два года вы обновите версию сторонней библиотеки, не заметив, что они также добавили доступный вам метод и вызвали, к сожалению, Abc
, за исключением того, что он имеет другой тип параметра где-то (так что обновление не предупреждает вас об компиляции временная ошибка), и она ведет себя по-разному или, может быть, даже имеет совсем другую цель. Вы действительно хотите, чтобы одна половина ваших частных звонков Abc
была тихо перенаправлена на стороннюю сторону Abc
? На Java это может случиться. В C# или C++ этого не произойдет.
Поверхность пути C# заключается в том, что для библиотеки с перераспределением легче добавлять функциональность, сохраняя при этом обратную совместимость. На самом деле:
- Вы никогда не будете связываться со своими частными вызовами своих клиентов внутри своего собственного кода.
- Вы никогда не будете ломать своих клиентов, добавив новый метод с уникальным именем, хотя вы все равно должны подумать дважды, прежде чем добавлять перегрузку своего собственного существующего метода.
Недостатком способа C# является то, что он разрезает дыру в философии ООП переопределяющих методов, когда-либо изменяющих только реализацию, но не API класса.
Я подозреваю, что вы должны сказать 'A b = new B()' – pm100
yup. вы должны сказать, что это тип 'A', потому что реализация« B »реализует тени« A » –
@DarrenKopp - Нет, это не тень. Это перегрузка, и это прекрасно. – Enigmativity