Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Структурная типизация в C#

Anna | 17.06.2014 | нет комментариев
Когда я постигал язык Go, мне дюже понравилась идея с приведением к интерфейсам по сигнатурам способов (остальная часть системы типов мне не понравилась, слишком примитивная). Это чай статическая утиная типизация! По научному: структурная типизация.

Если вдуматься, у такого подхода куча недостатков: начиная со трудности реализации и заканчивая нарушением правила подстановки Лисков. чай если у класса есть способ с требуемой сигнатурой (включая наименование), это вовсе не значит, что данный способ делает то, что ожидается.
Следственно в мейнстрим языках, в том числе в C#, структурная типизация не поддерживается. Казалось бы на этом и сказке конец. Но незадолго я понял что в плане, которым я теперь занимаюсь, структурная типизация используется. Подробности под катом.

В плане способ используется для работы с геттерами/сеттерами. Безусловно его дозволено применять и для обыкновенных способов, но вряд ли это даст что-то отличное.

Выходит. Представьте, что у вас есть комплект классов, у которых много идентичных свойств (наименование и тип).
И ещё огромнее классов, которым для работы необходимы данные из этих свойств. Скажем: есть класс DataItem с автосвойствами A, B и C. И класс Calculator, которому требуется значение свойства A, Дабы на его основе что-то вычислить и внести в B. А про C ему знать не нужно. Также ему не нужно знать и про класс DataItem, т.к. он может применяться и с другими классами у которых есть A и B.

Как это реализовать? Предварительно объявить для всякого, из таких свойств интерфейс, и всякий класс с такими свойствами пометить, как реализующий соответствующие интерфейсы. А способы классов покупателей объявлять generic-ами.

Реализация:

interface PropertyA{
  int A {get; set;}
}

class DataItem: PropertyA, PropertyB, PropertyC{
  public int A {get; set;}
  public bool B {get; set;}
  public string C {get; set;}
}

...

  void Calculate<T>(T data) where T: PropertyA, PropertyB{
    data.B = data.A > 0;
  }

Всё легко: указывая ограничения generic параметра дозволено собрать подходящий комплект полей, и объект всякого класс их реализующий передать в такой способ без каждых приведений.

Труднее осознать для чего это может сгодиться, и не является ли обстановка, когда сходственная техника необходима, ещё одним запахом кода.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB