Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
.NET 4.x

Классы или интерфейсы?

10.06.2017, 23:28. Показов 9191. Ответов 129
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Согласно новомодным книжкам от очередных гуру программистов, делаю на уровне интерфейсов.
Итак, накидаю примерчик:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public interface IRowViewModel : INotifyPropertyChanged
{
   ISomeItem Item {get;set;}
   string Designation { get;}
   string Name { get;}
}
 
public interface IMaterialRow : IRowViewModel
{
   double Thickness { get; }
}
 
public class SpecMaterialRow : PropertyChangedBase, IMaterialRow
{
   public ISomeItem Item { get; }
   public SpecMaterialRow(ISomeItem _item)
   {
      Item = _item;
   }
 
   public string Designation
   {
      get { return Item.Designation; }
      set { Item.Designation = value;}
   }
   
   public string Name
   {
      get { return Item.Name; }
      set { Item.Name= value;}
   }
   
   public double Thickness => Item.Thickness ;
}
Далее в коде гденить кастую и беру значение свойства.

Уно:
C#
1
2
3
4
if (rowViewModel is SpecMaterialRow )
  {
      string tempVar = ((SpecMaterialRow) rowViewModel ).Designation;
  }
Дос:
C#
1
2
3
4
if (rowViewModel is IMaterialRow  )
  {
      string tempVar = ((IMaterialRow) rowViewModel ).Designation;
  }
Вопрос: какая конструкция тогда вообще будет более корректна или верна?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.06.2017, 23:28
Ответы с готовыми решениями:

Как правильно разработать архитектуру программы (классы, интерфейсы)
Здраствуйте, минут двадцать пытаюсь сформулировать вопрос, то напишу то удалю :D, вообщем вопрос с чего начать разработку программы по...

Абстрактный класс, интерфейсы или простые классы с иерархией ?
Понять кое-что из ОПП 1-й Вопрос: Есть описание абстрактного класса abstract class HeroFactory { public abstract Movement...

Интерфейсы. Выделить у классов общий интерфейс(или интерфейсы)
Задание: У классов выделить общий интерфейс ( или интерфейсы ). первый класс : using System; using...

129
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 14:14  [ТС]
Студворк — интернет-сервис помощи студентам
А теперь очередной супер вопрос:
Исходя из кода в первом сообщении, (если там не понятно) уточняю: что классы, в которых я хочу изменять свойства = это лишь обёртка. Т.е. MVVM

Psilon, Usaga, чем реализация такой громоздкой конструкции как Visitor (ведь класс Animal был конечно-же утрированным) на нескольких классах с общими свойствами + уникальными для каждого класса будет лучше чем обычный Cast? Какой я профит то получу? С учётом что всяческие проверки у меня в Model, с учётом что задавать значение свойства этим Visitor я буду для ViewModel а она в свою очередь уже в Model,
лучше чем:
C#
1
2
3
4
5
6
7
IAnimal someAnimal = .....
 
Horse horsy = someAnimal as Horse;
   if(horsy!=null)
   {
      horsy.Color = Color.Red;
   }
0
Эксперт .NET
 Аватар для Usaga
14577 / 9480 / 1360
Регистрация: 21.01.2016
Сообщений: 35,763
12.06.2017, 14:23
Цитата Сообщение от skilllab Посмотреть сообщение
Т.е. MVVM
Каждая строка некоторой таблицы завёрнута в ViewModel? Это по-вашему MVVM?

Цитата Сообщение от skilllab Посмотреть сообщение
чем реализация такой громоздкой конструкции как Visitor (ведь класс Animal был конечно-же утрированным) на нескольких классах с общими свойствами + уникальными для каждого класса будет лучше чем обычный Cast?
Тем, что вам придётся последоватьельно делать каст к каждому объекту, с которым хотите поработать, до тех пор, пока не получится (не найдёте нужное). Если возможных типов будет много, то такая проверка сильно затянется. Double Dispatch (Visitor) позволит сделать это за один вызов метода, независимо от того, сколько у вас может быть типов (один или сто). Хлоп! и готово.

Добавлено через 1 минуту
Плюс, визитёр не позволит вам забыть сделать проверку на нужный тип - вы её обязаны будете реализовать, иначе код не скомпилируется.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 14:34  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Это по-вашему MVVM?
Да. Есть коллекция классов которые отображаются на таблицу. Именно у меня и именно в конкретном приложении это MVVM.
------------
Цитата Сообщение от Usaga Посмотреть сообщение
Если возможных типов будет много, то такая проверка сильно затянется.
Цитата Сообщение от Usaga Посмотреть сообщение
Правильно ли я понял, что в вашем коде для изменения, к примеру, коллекции из 300 элементов Animal метод Accept будет применён ко всем 300-ам элементам?
Верно.
Типов у меня 5.
т.е. применение метода во всех 300-ах элементах во время их перебора + изменение свойства в найденном (тот самый Accept) + продолжение перебора - это нормально. А узнавать тип при переборе и назначить значение свойства - это плохо. Ясно.

Добавлено через 8 минут
Ладно, хрен с ним в визитёром.
-------------
Цитата Сообщение от Psilon Посмотреть сообщение
И то и то не очень, но TypeOf выглядит поприличнее.
Почему проверка типа это "не очень", можете пожалуйста пояснить?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
12.06.2017, 14:42
Psilon, Usaga, пример с Визитером не плох, но вот единственное, что меня смущает - если мы имеем over много типов, то и методов в интерфейсе будет не мало. И плюсом, для каждого типа нужна своя реализация интерфейса, где опять же только ОДИН метод будет иметь тело, а все остальные-пустые. Оно может так и надо, но как-то напрягает меня такое...
Эх, вот как бы тут пригодилась конструкция из Явы, с внутренними классами реализующими интерфейс...
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 14:42  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
В последнем примере выглядит относительно адекватно
И почему при выборке вас уже не смутило приведение к интерфейсу? Хотя интерфейс именно разве что описывает дополнительные свойства основного интерфейса? Т.е. не Class : BaseClass а именно interface : mainInterface.
Да, я видел что вы дописали что "относительно". Но ведь выше же (да и ниже) решили что интерфейс тут теряет смысл. Тогда и представленная выборка - это чистый быдлокод? )))
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.06.2017, 15:00
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

insite2012, Ну например стоит посмотреть стандартный ExpressionVisitor. Там по Visit на каждый класс, ну да, много, но что поделать
Цитата Сообщение от skilllab Посмотреть сообщение
И почему при выборке вас уже не смутило приведение к интерфейсу? Хотя интерфейс именно разве что описывает дополнительные свойства основного интерфейса? Т.е. не Class : BaseClass а именно interface : mainInterface.
Да, я видел что вы дописали что "относительно". Но ведь выше же (да и ниже) решили что интерфейс тут теряет смысл. Тогда и представленная выборка - это чистый быдлокод? )))
Потому что пофильтровать выборку по какому-то условию - нормально, даже если это условие - проверка на тип (хотя это плохая проверка, поэтому относительно). А Код в стиле "если это тот тип, то давай вон-то" такой себе. Но иногда нужно, кстати, для этого рекомендуется пользоваться новым свитчем:
C#
1
2
3
4
5
switch (animal)
{
   case Horse horse: ...
   case Rabbit rabbit: ...
}
Цитата Сообщение от skilllab Посмотреть сообщение
чем реализация такой громоздкой конструкции как Visitor (ведь класс Animal был конечно-же утрированным) на нескольких классах с общими свойствами + уникальными для каждого класса будет лучше чем обычный Cast?
Проверкой типов. Если захочется добавить новый класс, то не получится его добавить, не реализовав метод accept. А значит, нужно будет дописать соответствующие визиторы.

В случае с кастом новый класс появился, а код об этом не узнал. В 3 местах, про которые помнили, поправили, про которые забыли - ну не будет ни один каст проходить и элемент будет просто игнорироваться. А потом будут вплывать баги, что где-то мы дописали каст и проверка изменилась, а где-то забыли и там пусто.
2
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 15:10  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
для этого рекомендуется пользоваться новым свитчем
у меня 4.6 он ещё недоступен.
Цитата Сообщение от Psilon Посмотреть сообщение
В случае с кастом новый класс появился, а код об этом не узнал.
Ясно. Такое не нужно. Нового точно не будет (если только государственный стандарт сменят который не менялся вот уже лет 30).

Добавлено через 2 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
Потому что пофильтровать выборку по какому-то условию - нормально
Вопрос не в самой выборке, а в каст на интерфейс. Собственно - изначальный вопрос темы.

Добавлено через 4 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
рекомендуется пользоваться новым свитчем
и кстати
C#
1
2
3
4
5
6
7
switch (obj.GetType().Name)
{
    case nameof(TextBox):
    ...
 
    default:
}
Такое ведь упрощает проверку на тип в разы. Один раз лезем за типом - далее выбираем. Вместо кучи If.

Цитата Сообщение от Psilon Посмотреть сообщение
А Код в стиле "если это тот тип, то давай вон-то" такой себе
Блин, почему? ))) (тут я опять упускаю из вида что-то фундаментальное)
0
Эксперт .NET
 Аватар для Usaga
14577 / 9480 / 1360
Регистрация: 21.01.2016
Сообщений: 35,763
12.06.2017, 17:04
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

Цитата Сообщение от skilllab Посмотреть сообщение
Типов у меня 5.
т.е. применение метода во всех 300-ах элементах во время их перебора + изменение свойства в найденном (тот самый Accept) + продолжение перебора - это нормально. А узнавать тип при переборе и назначить значение свойства - это плохо. Ясно.
Так, давайте разберёмся. У нас есть пять возможных типов. Триста элементов в коллекции. Чтобы понять с каким типом вы имеете дело, вам нужно выполнить проверку. У вас пять возможных типов, значит нужно от одной до пяти проверок:

C#
1
2
3
4
5
if (row is A) {}
else if (row is B) {}
else if (row is C) {}
else if (row is D) {}
else if (row is E) {}
Поскольку мы не знаем где что, то нам нужно проверить все триста элементов, так? Получается, что нам понадобится от трёхсот (если все элементы типа А) до полуторатысяч (если все элементы типа E) проверок, так? Визитёру понадобится только один вызов метода, чтобы определить тип элемента. Только один вызом метода. Если нужно проверить все триста элементов, то нам нужно только триста проверок, даже если типов будет 10000.

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

Подведём итоги: если вам нужно сделать проверку над тремя сотнями элементов, то неважно, будет это проверка IS или вызов Accept() - вам один хрен нужно сделать это триста раз! Но визитёр угадывает мелодию за одну ноту делая два вызова виртуальных методов, а явная проверка типа - от одной до пяти роясь в метаданных объекта.

Надеюсь, вы теперь-то разницу поняли?

Добавлено через 3 минуты
Цитата Сообщение от skilllab Посмотреть сообщение
Такое ведь упрощает проверку на тип в разы. Один раз лезем за типом - далее выбираем. Вместо кучи If.
Такая конструкция развернётся в кучу IF, как в примере выше. Т.е. оно не будет эффективнее ниразу, просто форма записи немного иная и всё.
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
12.06.2017, 17:06
Цитата Сообщение от skilllab Посмотреть сообщение
у меня 4.6 он ещё недоступен.
Вы не поверите, но возможности языка C# зависят в основном от компилятора, а не от версии .NET...
Так что все у вас доступно, если использовать корректный компилятор...
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 17:22  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Такая конструкция развернётся в кучу IF
Точно.
Ладно. Уговорили))) Обязок разверну этого визитёра, а как получится - перешлю самогонки)))))))))
Цитата Сообщение от Someone007 Посмотреть сообщение
если использовать корректный компилятор
Согласно этому https://github.com/dotnet/csha... History.md
введено в 2017 15.3 У меня старее. Понял.

Добавлено через 6 минут
Usaga, с назначением понятно, а как быть с GET?
0
Эксперт .NET
 Аватар для Usaga
14577 / 9480 / 1360
Регистрация: 21.01.2016
Сообщений: 35,763
12.06.2017, 17:26
skilllab, c каким get?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
12.06.2017, 17:27
Цитата Сообщение от skilllab Посмотреть сообщение
Согласно этому https://github.com/dotnet/csha... History.md
введено в 2017 15.3 У меня старее. Понял.
Нет. Это было добавлено в самой первой версии VS2017. А 15.3 (C# 7.1) еще не зарелизили. Скоро. Но там ничего особо интересного и не добавят. А вот в C# 7.2 планируется довольно интересная фича - blittable generic constrain.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 17:30  [ТС]
Usaga, это когда захочется отсюда Классы или интерфейсы?
вытащить
C#
1
var someFromShit = FirstShit.FirstShitParam;
0
Эксперт .NET
 Аватар для Usaga
14577 / 9480 / 1360
Регистрация: 21.01.2016
Сообщений: 35,763
12.06.2017, 17:34
skilllab, вы в метод Visit* всю необходимую логику работы с объектом помещаете. Всю. И обновления свойств и чтение и на дуде играние и в пупе ковыряние.

Или вы уже издеваться начали?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 17:36  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Это было добавлено в самой первой версии VS2017
а разве switch(Type) это не https://github.com/dotnet/csha... n-match.md
Ну кароч, я попробовал написать - и у меня не сработало. Может там этот Type должен ещё что-то определённое имплементировать?
C#
1
2
3
4
switch(Animal)
{
}
//Animal является тип, который недопустим в данном контексте
Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Или вы уже издеваться начали?
нет, что вы. То что для вас уже давно всё испробовано и применено - это ж не значит что и у большинства на форуме так же))
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
12.06.2017, 17:42
Цитата Сообщение от skilllab Посмотреть сообщение
а разве switch(Type) это не https://github.com/dotnet/csha... n-match.md
Это что-то другое вроде, не вникал в подробности...
А то что уже реализовано используется как-то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class Animal
    {
 
    }
 
    public class Cat : Animal
    {
    }
 
    public class Dog : Animal
    {
 
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            Animal obj = new Cat();
 
            switch(obj)
            {
                case Cat a:
                    Console.WriteLine("cat case!" + a);
                    break;
                case Dog b:
                    Console.WriteLine("dog case!" + b);
                    break;
                default:
                    Console.WriteLine("default case!");
                    break;
            }
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 17:56  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
используется как-то так
Сработало, скомпилировалось и вызвалось как надо. Но студия подчёркивает obj (если брать ваш пример) и пишет
Value of integral type expected
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.06.2017, 18:30
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

Цитата Сообщение от Usaga Посмотреть сообщение
Такая конструкция развернётся в кучу IF, как в примере выше. Т.е. оно не будет эффективнее ниразу, просто форма записи немного иная и всё.
Оно развернется в хэш-таблицу, по которой будет лукап происходить. Только чтобы GetType Name вытащить уйдет больше, чем на все if else.
Цитата Сообщение от skilllab Посмотреть сообщение
Блин, почему? ))) (тут я опять упускаю из вида что-то фундаментальное)
Потому что постоянно добавляются\удаляются типы. Даже если стандарт и 30 лет. Просто потому что меняется представление модели. У эванса DDD почитай, поймешь, о чем я. Буквально во введении это объясняется.
skilllab, если студия 2017, то все работать будет
Миниатюры
Классы или интерфейсы?  
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 18:42  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Оно развернется в хэш-таблицу
Да вроде в тупую сравнивается имя. Никаких таблиц.

Иф зиз вен го ту адрес....
Миниатюры
Классы или интерфейсы?  
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
12.06.2017, 18:44  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
если студия 2017, то все работать будет
а я и не сказал что не работает. Это видать решарпер "подчёркивает".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.06.2017, 18:44

Обобщённые интерфейсы и классы
Здравствуйте, прошу помочь разобраться в следующем вопросе, у меня есть обобщённый класс class Myclass<T> : IMy<T> ...

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

Полиморфные классы и интерфейсы
Создать перечисления для представления дней недели. Вывести все значения на экран.

Интерфейсы и абстрактные классы
Всем привет! Помогите пожалуйста, недавно подкинули вопрос, который заинтересовал: что было бы если разработчики Майкрософт Icomparable...

Абстрактные классы и интерфейсы. Разница
Вот хоть убейте, не могу понять разницы между абстрактным классом и интерфейсом. До этого изучал C++, там не было интерфейсов, скорее всего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru