C #: специфичные для типа / статические методы, поддерживающие переопределение

В C # невозможно переопределить статический метод. Тем не менее, у меня есть некоторые методы для конкретных типов (вместо обычных методов экземпляров), и я хочу дать пользователю возможность переопределить эти методы, и, кроме того, иметь возможность вызывать эти (переопределенные) методы из моего собственного кода, не зная о «переопределение», сделанное пользователем. Если бы метод был статическим, мне нужно было бы знать имя типа класса пользователя заранее, а это не то, что мне нужно.

Как реализовать методы для конкретных типов, такие как Прочтите , Записать и GetLength и разрешить переопределение?

Предпосылки

Существует абстрактный класс Row , производные типы / классы которого представляют тип row , экземпляр которого представляет фактическую строку и ее поля / данные в очень простой таблице. Каждый тип строки имеет фиксированную длину, а таблица - это просто последовательность строк в файле. Классу Row требуются три метода: методы Read и Write , которые выполняют свою очевидную функцию для потока с заданным смещением, и GetLength метод, который возвращает фиксированную длину типа строки.

Теперь пользователь может расширить мой класс Row и предоставить реализации для Read , Запишите и GetLength для его или ее конкретного типа строки , а также полей и свойств, которые будут использоваться в его или ее конкретном экземпляре строки . Например, класс SomeUserRow может иметь 32-битное целочисленное поле и однобайтовое поле, фиксированную длину в 5 байтов и соответствующую реализацию метода чтения и записи.

Методы

Read

Очевидный фабричный метод, связанный с типом, поэтому я бы определил его в самом классе. Я бы сделал его статическим , но тогда его нельзя будет переопределить. Затем я мог бы сделать его защищенным абстрактом и создать статический универсальный метод Read для его вызова, как предлагается в этой публикации . Но мне также нужно иметь возможность вызывать этот метод из моего кода, не зная типа реализованного пользователем класса. Я не могу просто вызвать Row.Read () , потому что я еще не знаю о типах пользователей.

Write

Возможный метод экземпляра, потому что большинство людей хотят писать существующая строка в поток. Но имея Read статическим, кажется странным делать Write методом экземпляра.

GetLength

Не фабричный метод, но все же связанный с типом. Опять же, я бы сделал его статичным, но это предотвращает переопределение. Я могу сделать его методом экземпляра, который можно переопределить, но мне кажется неправильным делать это в объектно-ориентированной среде: создание экземпляра просто для получения значения, которое не зависит от экземпляра ( int length = new T (). GetLength () ), а скорее от его типа.

Я также думал о перемещении три метода из классов в отдельный класс, но это все еще не решает проблему переопределения. Или иметь класс, который хранит список или словарь делегатов, указывающих на правильные методы. Он не допускает реального переопределения (замена указателя метода в массиве делегатов - это не то, что я бы считал переопределением true ), и он перемещает методы, зависящие от типа, от типа, который Я считаю, что с точки зрения разработчиков это нехорошо: иметь два или более места для изменения, когда вы просто хотите изменить тип.

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

1
задан Community 23 May 2017 в 12:18
поделиться