Переопределение внутреннего абстрактного метода в другой сборке - PullRequest
7 голосов
/ 07 июня 2011

Я сейчас работаю над проектом ac #, который использует другую библиотеку .net.Эта библиотека (помимо прочего) анализирует последовательность в дереве.Все элементы имеют некоторый тип, который наследуется от абстрактного класса Sequence.Мне нужно было немного изменить поведение и подкласс Sequence сам (давайте назовем это MySequence).После того, как дерево было создано, я мог заменить некоторые узлы дерева объектами своего собственного класса.

Теперь была опубликована новая версия библиотеки, и была введена функция Copy со следующей сигнатурой:

internal abstract Sequence Copy();

Я пытался перенести мой код в новую версию и переопределить его, но что бы я ни делал, я получаю две ошибки:

MySequence не реализует наследуемыйабстрактный член 'Sequence.Copy()'
и:
MySequence.Copy() ': не найдено подходящего метода для переопределения

Это имеет смысл, поскольку оно является абстрактным (-> оно должно бытьперезаписано) и внутреннее (-> не может быть перезаписано из-за скрытой видимости извне сборки)

Итак, проблема в том, что я понимаю, почему это происходит, но не знаю, что с этим делать,Для моего проекта важно иметь подкласс Sequence.

И что я также не понимаю, так это то, почему модификатор internal abstract разрешен в первую очередь, поскольку он в основном разрешает любое создание подклассов всего класса извне сборки!?

Есть лилюбой способ решить это?Через отражение или что-то?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

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

Обойти это невозможно.

3 голосов
/ 07 июня 2011

По сути, вам не повезло, не изменив библиотеку. Может существовать подкласс Sequence, который реализует Copy, который вы можете получить в новой версии. Но вполне вероятно, что метод Copy необходим в других частях библиотеки для создания клонов.

1 голос
/ 07 июня 2011

Если у библиотеки есть тип с членом с модификаторами internal abstract, я заключаю, что разработчики этой библиотеки не хотели, чтобы кто-либо выводил свой собственный тип из этого типа.Вы не можете обойти это.

Вы можете рассмотреть, было ли это сделано намеренно.Вы должны спросить издателей.Это может быть ошибкой, и в этом случае издатели, вероятно, выпустят исправление.Если это сделано намеренно, вы должны придумать альтернативное решение, не основываясь на этом типе.РЕДАКТИРОВАТЬ: Или, возможно, они предназначались для вас, чтобы получить только из производных типов в той же сборке, которые уже реализуют этот элемент.

...