Форум программистов, компьютерный форум, киберфорум
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. Показов 9654. Ответов 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
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
14.06.2017, 08:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
то при касте обязательно будет проверка на соответствие типов и, соответственно, заглядывание в метаданные
castclass используется. не знаю во что он при выполнении превращается.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
14.06.2017, 08:37  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
просто реализует идею со свойством-признаком в общем, базовом классе, что я изначально предложил.
Т.е. вот такое это нормально?
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
public enum Tag
    {
        one,
        two,
        three
    }
    public abstract class Animal
    {
        public abstract Tag  Tag {get;}
    }
    public class Horse:Animal
    {
        public string Name { get; set; }
        public string Color { get; set; }
        public override Tag Tag => Tag.one;
    }
 
    public class Rabbit:Animal
    {
        public string Name { get; set; }
        public bool Tail { get; set; }
 
        public override Tag Tag => Tag.two;
    }
0
Эксперт .NET
 Аватар для Usaga
14817 / 9593 / 1369
Регистрация: 21.01.2016
Сообщений: 36,138
14.06.2017, 08:39
pycture, он превращается в проверку соответствия типов с возможностью выброса исключения, если что не так.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
14.06.2017, 08:40  [ТС]
C#
1
2
3
4
5
6
7
8
9
List<Animal> anim = new List<Animal>() { new Horse(), new Rabbit() };
 
            foreach (Animal current in anim)
            {
                if(current.Tag == Tag.one)
                {
                    НАШЛИ ЛОШАДЬ!!!
                }
            }
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
14.06.2017, 08:47
Цитата Сообщение от Usaga Посмотреть сообщение
Собственно, всю картину портит это:
учитывая что это работало на вот таком наборе данных
C#
1
2
3
4
5
6
            List<Animal> shitList = new List<Animal>();
            for (var i = 0; i < 100000; i ++)
            {
                shitList.Add(new Horse { Name = "Кешик" });
                shitList.Add(new Rabbit{ Name = "blah2" });
            };
т.е. обновление и каст срабатывало в 50% случаях. явный каст
C#
1
Program.Animal.Horse horse2 = (Program.Animal.Horse)animal;
остается более предпочтительным чем двойная диспетчеризация.

Добавлено через 53 секунды
Цитата Сообщение от skilllab Посмотреть сообщение
НАШЛИ ЛОШАДЬ!!!
молодцы и ?

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
реализует идею со свойством-признаком в общем, базовом классе, что я изначально предложил.
вот только в c# проблемка есть. за тэгами следить некому.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
14.06.2017, 08:49  [ТС]
Цитата Сообщение от pycture Посмотреть сообщение
молодцы и ?
Это к Usaga,
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
14.06.2017, 08:50
Цитата Сообщение от skilllab Посмотреть сообщение
Это к Usaga,
это я предыдущий код не заметил. но в c# проблема от
В случае с кастом/ифом новый класс появился, а код об этом не узнал. В 3 местах, про которые помнили, поправили, про которые забыли - ну не будет ни один каст проходить и элемент будет просто игнорироваться. А потом будут вплывать баги, что где-то мы дописали каст и проверка изменилась, а где-то забыли и там пусто.
т.е.
Цитата Сообщение от skilllab Посмотреть сообщение
Т.е. вот такое это нормально?
в случае c# не нормально
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
14.06.2017, 08:56  [ТС]
pycture, ну тогда идеология "стэйт машины" не применима к C# и нужно использовать технологии именно C#. Ап чом и писал
Цитата Сообщение от Usaga Посмотреть сообщение
Хотелось бы в рамках одного языка сравнить.
0
Эксперт .NET
 Аватар для Usaga
14817 / 9593 / 1369
Регистрация: 21.01.2016
Сообщений: 36,138
14.06.2017, 08:58
Цитата Сообщение от pycture Посмотреть сообщение
вот только в c# проблемка есть. за тэгами следить некому.
Ну, нужно программисту следить, как и в любом другом случае\языке. Ничего с этим не поделать.

Цитата Сообщение от pycture Посмотреть сообщение
остается более предпочтительным чем двойная диспетчеризация.
Именно в таком варианте да - может и предпочтительно (а лучше не явный каст, а AS - оно должно быть побыстрее на полшишечки). В более сложных сценариях может и нет.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
14.06.2017, 08:59
Цитата Сообщение от skilllab Посмотреть сообщение
ну тогда идеология "стэйт машины" не применима к C#
к C# не применима идеалогия работы с данными (интерфейсы это для него). о чем писал я. разница в объеме кода и его размазаности заметна?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
14.06.2017, 09:01  [ТС]
Цитата Сообщение от pycture Посмотреть сообщение
к C# не применима идеалогия работы с данными
Я не настолько объёмно и долго и много работал с данными и их обработкой в C# чтоб категорично ответить - "ДА"
Цитата Сообщение от pycture Посмотреть сообщение
разница в объеме кода и его размазаности заметна?
в этом случае - ДА.
0
Эксперт .NET
 Аватар для Usaga
14817 / 9593 / 1369
Регистрация: 21.01.2016
Сообщений: 36,138
14.06.2017, 09:03
Это уже пошло какое-то C# vs X.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
14.06.2017, 09:03
Цитата Сообщение от Usaga Посмотреть сообщение
Ну, нужно программисту следить, как и в любом другом случае\языке. Ничего с этим не поделать.
эт у вас в c# надо руками следить/описывать. а у меня за добавлением нового подтипа в f# следит компилятор. и если в Animal появится новый подтип, то все match'и при компиляции (и в интелсенсе) дружно вякнут "мы не поняли что это такое и как это обработать"
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
14.06.2017, 09:04  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Ну, нужно программисту следить,
А если добавить
C#
1
2
3
4
5
6
7
8
switch(TAG)
{
case One:
....
case Two:
 
default: throw NotImplementedExeption("Добавь TAG в " + someNewAnimal.GetType().Name);
}
0
Эксперт .NET
 Аватар для Usaga
14817 / 9593 / 1369
Регистрация: 21.01.2016
Сообщений: 36,138
14.06.2017, 09:04
pycture, я думаю это не очень уместные замечания (я про C#). Мы обсуждаем тему в рамках данного языка и то, что он что-то делает хуже\не так элегантно как что-то другое, делу особо не поможет.
0
14.06.2017, 09:05

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
Это уже пошло какое-то C# vs X.
не. это визиторы vs адт. :) некоторые верят что адт добавят в C#

0
Эксперт .NET
 Аватар для Usaga
14817 / 9593 / 1369
Регистрация: 21.01.2016
Сообщений: 36,138
14.06.2017, 09:11
skilllab, это хорошая практика.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от pycture Посмотреть сообщение
некоторые верят что адт добавят в C#
Было бы здорово. Можно было бы не загаживать классы всякими Accept-ами. :)



Добавлено через 4 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
это хорошая практика.
Может быть лучше даже использовать Debug.Assert(), чем исключения, но это уже предмет другой темы.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
14.06.2017, 09:14  [ТС]
Usaga, ну короче, ваше предложение (где-то в начале темы) про общий признак, сейчас решает. Вон, даже pycture с F# его (в неявном виде) подтвердил. Чтоб не кастовать направо и налево. А с визитором попозже разберусь. Там потом будет куда его применить.
0
14.06.2017, 09:17

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
Мы обсуждаем тему в рамках данного языка и то...
не разбив скорлупы из яйца не выберешься. не надо игнорировать то чего в данный момент нет в языке. оно может появится (как линк). или знание о нем может решать задачу отличным от общепринятого решением. если разобраться то 90% паттернов из книги четырех, в принципе не существуют в языках не столь замкнутых на ооп как шарп или жаба. что это значит? это значит прежде чем использовать паттерный костыль надо хотя бы иметь представление какую элементарную задачу он призван решить.
В данной теме наглядно видно что визиторы, это эмуляция адт.

0
Эксперт .NET
 Аватар для Usaga
14817 / 9593 / 1369
Регистрация: 21.01.2016
Сообщений: 36,138
14.06.2017, 09:19
Цитата Сообщение от pycture Посмотреть сообщение
В данной теме наглядно видно что визиторы, это эмуляция адт.
Ну как бы да.

skilllab, ок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2017, 09:19

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru