Принуждение запечатанного класса - PullRequest
0 голосов
/ 29 ноября 2018

Возможно ли в C # форсировать закрытый класс через интерфейс или подстановочный знак?Например, что-то вроде:

public interface A<SealedItem> where SealedItem : sealed

или, может быть, что-то вроде:

public sealed interface A {}
public class B : A // B is now sealed.

Это может звучать странно, но я бы хотел "вызвать" запечатанный экземпляр для встряхивания соглашений.Существует ли что-то подобное?

Дополнительный контекст: у меня есть объекты запроса, которые предоставляются через API.Я использую только объект запроса для «чтения» данных.Эти объекты запроса могут со временем меняться, однако я не хочу, чтобы эти объекты запроса влияли друг на друга.Использование наследования в моем объекте запроса может вызвать «проблемы».Так что в моем случае было бы неплохо «заставить» запечатанный класс.

Почему наследование может быть плохим в моей ситуации: Допустим, у меня есть следующие запросы:

public class RequestA { public int Number { get; set; } }
public class RequestB : RequestA { public int Id { get; set; } }

Оба запроса используют значение в этом примере.Скажем, реализация RequestA меняется, и ей больше не нужно значение number.Мой код для запроса B теперь сломается (только небольшой пример).Другой пример - когда RequestA получает новое свойство, которое не используется Request B. Теперь у меня есть неиспользуемое свойство в логике для моего RequestB.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Нет, это невозможно.

Тот факт, что класс sealed просто означает, что он не может быть унаследован.

Например, что-то вроде: public interface A<SealedItem> where SealedItem : sealed

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

или может быть что-то вроде: public sealed interface A {}

Интерфейс не может быть помечен как sealed.

Единственное, что вы можете сделать, чтобы предотвратить наследование, это использовать типы значений - структуры не могут наследовать от чего-то другого, кроме специального класса ValueType.(и это вне вашего контроля), и не может быть унаследован от -
от Structs (Руководство по программированию в C #) :

Структура не может наследоваться от другой структуры или классаи это не может быть основой класса.

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

Обновление - с последующим обновлением вопроса:

Дополнительный контекст: у меня есть объекты запроса, которые предоставляются через API.Эти объекты запроса могут со временем меняться, однако я не хочу, чтобы эти объекты запроса влияли друг на друга.

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

Проверьте Выбор между классом и структурой , чтобы увидеть, соответствуют ли ваши запросы рекомендациям:

✓ СООБРАЖЕНИЕ определение структуры вместо класса, если экземпляры типа маленькие и обычно недолговечные или обычно встроены в другие объекты.

X AVOID определение структуры, если тип не имеет всех следующих характеристик:

  • Логически представляет одно значение, подобное примитивным типам (int, double и т. Д.).
  • Размер экземпляра менее 16 байт.
  • Он неизменен.
  • Его не нужно часто упаковывать.

Во всех остальных случаях.ases, вы должны определить свои типы как классы.

0 голосов
/ 29 ноября 2018

Нет, это не так.

Кстати, вы не наследуете интерфейсы, вы реализуете интерфейсы, т.е. вы просто предоставляете реализацию пустым методам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...