Как назвать переопределенные методы в подклассе? Потенциальный кандидат на рефакторинг

Я не знаю много о ASP.NET, но почему бы не записать пользовательскую функцию для onload события, которое в свою очередь вызывает обе функции для Вас? Если у Вас есть две функции, назовите их обоих из третьего сценария, который Вы регистрируете для события.

5
задан oligofren 27 January 2010 в 16:28
поделиться

3 ответа

То, что вы описали, должно работать как есть.

Действительно ли obj.doSomething () вызывает реализацию суперкласса? Если это так, вы неправильно его игнорируете. Убедитесь, что вы не изменили подпись в ваших замененных версиях.

2
ответ дан 14 December 2019 в 04:41
поделиться

Когда у вас есть это:

void fooBar(SuperClass obj) {
    obj.doSomething();
}

, тогда тип времени компиляции для obj будет SuperClass . Это означает, что компилятор будет проверять, что SuperClass имеет метод doSomething () .
В среде выполнения вы можете заменить подкласс SuperClass , это принцип замены Лискова . Метод foobar () не знает и не должен знать, каков тип среды выполнения obj , только то, что он является производным от SuperClass и так doSomething () может быть вызван.

Что касается вашего примера:

fooBar( new SubClassSpecial1() );

В этом случае вы знаете, что тип времени выполнения параметра - SubClassSpecial1 , который, в частности, переопределяет doSomething () . Во всех случаях вызывается правильный метод.

Несколько слов о рефакторинге. Вы можете рассмотреть возможность рефакторинга своей иерархии.
Ваш базовый класс SuperClass должен определять doSomething () как абстрактный. Три ваших класса, которым требуется одна и та же реализация doSomething () , должны унаследовать ее от промежуточного базового класса, имеющего эту конкретную реализацию. Два ваших специальных класса должны наследовать непосредственно от SuperClass и иметь собственную реализацию doSomething () .

1
ответ дан 14 December 2019 в 04:41
поделиться

Эта часть вашего вопроса меня немного смущает:

Конечно, я хотел, чтобы каждый объект вызывал свою собственную версию doSomething (), но не смог поймите, что для этого нужно объявить obj как один из подклассов методов. А теперь беспорядок.

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

Так что я думаю, что то, что вы пытались сделать, должно работать просто хорошо, например, все эти объявления можно использовать для перехода к методу foobar:

SuperClass sc1 = new SubClassSpecial1();
SubClassSpecial2 sc2 = new SubClassSpecial2();
//etc..
5
ответ дан 14 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: