170 похожих чатов

Есть ли способ в интерфейсе ограничить значение переменной? Например указано

поле Type SomeType { get; }, ограничение для него SomeTypeA и SomeTypeB, чтобы там не мог быть SomeTypeC?

30 ответов

25 просмотров

Нет, это нарушает принцип Барбары Лисков

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

Sergey-Efimov Автор вопроса
Andrew Shurunov
Нет, это нарушает принцип Барбары Лисков

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

Sergey-Efimov Автор вопроса
Mikhail Lomonosov
если родитель обший никак..да я не представляю что...

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

Sergey Efimov
не особо понимаю каким образом, если явно каким ли...

Я так понял, что SomeTypeA, SomeTypeB и SomeTypeC наследуются от Type. Так?

Sergey Efimov
Да, исключение аргумента или ошибку компиляции Дум...

А через Generic нельзя? Типа ISomeInterface<T> where T : Type public T SomeType { get; }

Sergey-Efimov Автор вопроса
Andrew Shurunov
Я так понял, что SomeTypeA, SomeTypeB и SomeTypeC ...

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

Sergey-Efimov Автор вопроса
Александр
А через Generic нельзя? Типа ISomeInterface<T> wh...

нет, так как интерфейс должен быть общим, а не 2 разных для 2х классов или я не в ту сторону думаю

Sergey Efimov
нет, так как интерфейс должен быть общим, а не 2 р...

Так он и есть общий, где там два разных-то? Главное чтобы SomeTypeA и SomeTypeB были в дереве наследования на одном уровне, но интерфейс будет один, при этом реализовать его можно будет только для этих типов

Sergey-Efimov Автор вопроса
Александр
Так он и есть общий, где там два разных-то? Главно...

это сделает невозможным поместить 2 разных наследника интерфейса в 1 список, если указывать дженерик тип

Sergey Efimov
нет, по идее вообще должны быть ограничены интерфе...

Всё ещё не понимаю задачу Если это просто несвязанные типы A, B и C, то чтобы это реализовать нужен union/discriminated union, система типов шарпов это не поддерживает Можно как-то извратиться, навесить на A и B отдельный интерфейс, либо, если это сторонние классы, то написать обертки для них. Но при этом нет гарантий что не будет некого типа D, тоже реалиюзующий этот интерфейс

Sergey-Efimov Автор вопроса

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

Sergey-Efimov Автор вопроса
Phantom
Гарантировать ты это никак не можешь

А атрибута нет для этого например?

Sergey Efimov
А атрибута нет для этого например?

А что этот атрибут будет делать?

Sergey-Efimov Автор вопроса

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

Sergey Efimov
проверять тип

Как? Атрибут это просто метка

Звучит как будто там где-то должен быть enum вместо колдовства с типами

Sergey-Efimov Автор вопроса
Phantom
Как? Атрибут это просто метка

ну есть же атрибуты ограничения длины строки, как они работают?

Sergey Efimov
ну есть же атрибуты ограничения длины строки, как ...

Рефлексией и не при любом выходе сеттера, проверяют текущее состояние

зачем?

Sergey Efimov
как раз суть в том, чтобы в интерфейсе был тип, но...

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

Sergey-Efimov Автор вопроса
Phantom
Не видел таких

https://learn.microsoft.com/ru-ru/dotnet/api/system.componentmodel.dataannotations.stringlengthattribute?view=net-7.0 Этот вроде для браузера, но видел аналогичные

Sergey Efimov
как раз суть в том, чтобы в интерфейсе был тип, но...

Лучше сформулируй более общую задачу, может кто подскажет более удачное решение

Sergey Efimov
https://learn.microsoft.com/ru-ru/dotnet/api/syste...

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

Sergey Efimov
https://learn.microsoft.com/ru-ru/dotnet/api/syste...

Ну вот кто то занимается этой валидацией

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта