Форум программистов, компьютерный форум, киберфорум
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. Показов 9132. Ответов 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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
14.06.2017, 09:04
pycture, я думаю это не очень уместные замечания (я про C#). Мы обсуждаем тему в рамках данного языка и то, что он что-то делает хуже\не так элегантно как что-то другое, делу особо не поможет.
0
14.06.2017, 09:05

Не по теме:

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

0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,725
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
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru