Я не знаю много о ASP.NET, но почему бы не записать пользовательскую функцию для onload события, которое в свою очередь вызывает обе функции для Вас? Если у Вас есть две функции, назовите их обоих из третьего сценария, который Вы регистрируете для события.
То, что вы описали, должно работать как есть.
Действительно ли obj.doSomething () вызывает реализацию суперкласса? Если это так, вы неправильно его игнорируете. Убедитесь, что вы не изменили подпись в ваших замененных версиях.
Когда у вас есть это:
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 ()
.
Эта часть вашего вопроса меня немного смущает:
Конечно, я хотел, чтобы каждый объект вызывал свою собственную версию doSomething (), но не смог поймите, что для этого нужно объявить obj как один из подклассов методов. А теперь беспорядок.
Конечно, объявление не имеет значения, метод doSomething () всегда будет вызываться в соответствии с типом времени выполнения класса.
Так что я думаю, что то, что вы пытались сделать, должно работать просто хорошо, например, все эти объявления можно использовать для перехода к методу foobar:
SuperClass sc1 = new SubClassSpecial1();
SubClassSpecial2 sc2 = new SubClassSpecial2();
//etc..