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

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

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

30 ответов

15 просмотров

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

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

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...

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
32
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Подскажите пожалуйста, а я могу вот такую штуку использовать? rpc, только реализованное в реббите https://www.rabbitmq.com/tutorials/tutorial-six-php ( или https://habr.com/ru...
Artyom
11
а мы ещё не созрели до того, чтобы создать отдельный чатик про настройку редакторов?
Cheese Syrowiecki
16
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Всем привет! У меня почему-то по-разному отображается TListView в Debug и Release режимах (FireMonkey)! При запуске под Win приложения TListView заливается программо. в Debug ...
Александр COM
8
Ладно, ещё тупого спрошу. Код должен банально вывести значение регистра на консоль, на деле же не выводя ничего, просто оставляя нерабочую консоль (открыта, ничего не написан...
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
25
Парни, спасайте. RAD Studio 12 творит какую-то дичь. У меня есть метод (event), который вызывает другой метод, т.е. он состоит из 1-й строки вызова. Ставлю бряк на event, запу...
Eugene Krasnikov (ᴊɪɴ x)
3
Карта сайта