[C#] выбор перегруженного метода при передаче базового класса

serg05

Абстрактный базовый класс БК
Наследники А:БК, Б:БК
Метод ( А параметр )
Метод ( Б параметр )
Как сделать чтобы при вызове Метод ( БК ) вызвывался нужный метод - в зависимости от того, на что БК в данный момент указывает А или Б. Шарп естественно кидает комайлтайм еррор. Но с другой стороны очевидно, что в рантайме это запросто можно выполнить.

bleyman

На самом-то деле у тебя все методы выглядят как static Method(BK _this, BK parameter причём по первому параметру допускается автоматический полиморфизм. Поэтому если у тебя Метод имплементирован только в БК (то есть первый параметр не требует разрешения через полиморфизм то маза поменять местами параметр и объект-владелец метода, и сделать метод виртуальным. Тогда всё прекрасно само отрезолвится.
Если нет, то у тебя получается аж четыре возможных комбинации, что довольно страшно и плохо (особенно если потом ещё какие-нибудь потомки появятся - количество имплементаций будет расти геометрически и нужно пытаться располовинить функциональность того, что происходит в методе Метод на три половины: действия с первым параметром, действия со вторым параметром, и статический метод Метод, который эти действия инициирует и совокупляет.

serg05

автоматический полиморфизм. Поэтому если у тебя Метод имплементирован только в БК (то есть первый параметр не требует разрешения через полиморфизм то маза поменять местами параметр и объект-владелец метода, и сделать
Я имел ввиду метод другого класса. А вообще делаю что-то типа трансятора одних объектов в другие. Типа есть набор объектов известных всем(критерии фильрации данных при доступе к бд) - им желательно либо интерфейс общий иметь или базовый класс. Есть потребители этих объектов которые в свою очередь хотят в зависимости от собственной реализации их превращать в другой набор объектов (критериев которые они сами понимают).
До первого компайла все получалось замечательно =): были Unary, Binary criterions, Unary, Binaray logical expressions, все это в перспективе должно было рекурсивно оттранслироваться в понятный моему персистеру наборчик.
Но транслятор(класс) в котором определены перегруженные методы translate не понимает когда ему в качестве аргумента подсовывают базовый класс. А жаль

nik93

А как сделать чтоб метод был Public но не наследовался? Понятно что практического смысла мало, но всетаки?

tipnote

Это нарушение полиморфизма, поэтому при создании C# Хейлсберг отказался от этой возможности Object Pascal //Krasin
Оставить комментарий
Имя или ник:
Комментарий: