Re: [Ann] Next big thing in c#: default interface methods
От: vorona  
Дата: 26.03.17 15:32
Оценка: 34 (3) +1
The C# Programming Language

Krzysztof Cwalina

Perhaps I am stirring up quite a bit of controversy with this statement, but I believe the lack of support for multiple inheritance in our type system is the single biggest contributor to the complexity of the .NET Framework. When we designed the type system, we explicitly decided not to add support for multiple inheritance so as to provide simplicity. In retrospect, this decision had the exact opposite effect. The lack of multiple inheritance forced us to add the concept of interfaces, which in turn are responsible for problems with the evolution of the framework, deeper inheritance hierarchies, and many other problems.

Re[6]: [Ann] Next big thing in c#: default interface methods
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.03.17 09:13
Оценка:
Здравствуйте, HrorH, Вы писали:
HH>А почему компилятор не может отличить название переменной от ключевого слова, как это он делает например с async?
Потому что async в качестве ключевого слова встречается только там, где не может стоять никакая переменная или имя типа.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: [Ann] Next big thing in c#: default interface methods
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.03.17 10:23
Оценка:
Здравствуйте, AlexRK, Вы писали:
ARK>Кстати, пришло в голову — так надо было бы сделать динамическую диспетчеризацию для методов расширения, т.е. выбор extension-метода по реальному типу параметра this, а не статическому. Вроде особых подводных камней тут не должно быть.
Навскидку, это открывает потенциальную дверь в бесконечность. Поведение кода может произвольно измениться просто из-за того, что в домен загрузили новую сборку с более подходящим extension.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: [Ann] Next big thing in c#: default interface methods
От: HrorH  
Дата: 27.03.17 11:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Потому что async в качестве ключевого слова встречается только там, где не может стоять никакая переменная или имя типа.

Так вроде бы и с trait также

   public trait Foo
   {
     ...
   }


какая тут может стоять переменная или имя типа, чего-то не могу въехать.
Re[2]: [Ann] Next big thing in c#: default interface methods
От: yenik  
Дата: 27.03.17 13:34
Оценка: +3
V>The C# Programming Language

V>Krzysztof Cwalina

V>

V>Perhaps I am stirring up quite a bit of controversy with this statement, but I believe the lack of support for multiple inheritance in our type system is the single biggest contributor to the complexity of the .NET Framework. When we designed the type system, we explicitly decided not to add support for multiple inheritance so as to provide simplicity. In retrospect, this decision had the exact opposite effect. The lack of multiple inheritance forced us to add the concept of interfaces, which in turn are responsible for problems with the evolution of the framework, deeper inheritance hierarchies, and many other problems.


Сильно. Только если бы они с самого начала решили по-другому, неизвестно, оказался бы хрен слаще редьки.
Re[8]: [Ann] Next big thing in c#: default interface methods
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.03.17 16:34
Оценка:
Здравствуйте, HrorH, Вы писали:

HH>Здравствуйте, Sinclair, Вы писали:


S>>Потому что async в качестве ключевого слова встречается только там, где не может стоять никакая переменная или имя типа.

HH>Так вроде бы и с trait также

HH>
HH>   public trait Foo
HH>   {
HH>     ...
HH>   }
HH>


HH>какая тут может стоять переменная или имя типа, чего-то не могу въехать.

В текущем C# это компилируется Ок:
public class Test
{
    public class trait { }
    public trait IFoo { get; set;}
}

Попробуйте заставить это скомпилироваться в вашем гипотетическом C# с ключевым словом trait.
Прямолинейная реализация приведёт к поведению, такому же как сейчас для
public class Test
{
    public class interface { }
    public interface IFoo { get; set;}
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: [Ann] Next big thing in c#: default interface methods
От: HrorH  
Дата: 27.03.17 21:17
Оценка: :)
Здравствуйте, Sinclair, Вы писали:

S>Попробуйте заставить это скомпилироваться в вашем гипотетическом C# с ключевым словом trait.

Если проблема только с вложенными trait, то их можно просто запретить.
Тем более что непонятно, какая от них польза. По крайней мере вложенных интерфейсов я чего-то видел немного.
Re: [Ann] Next big thing in c#: default interface methods
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 04.04.17 08:28
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Кто там хотел трайты-миксины?

S>Неплохой ликбез по сабжу, тынц и тынц. Также см тут.

S>
S>interface IA
S>{
S>    void M() { WriteLine("IA.M"); }
S>}

S>class C : IA { } // OK

S>// ...

 Есть в Delphi есть директива implements 

[q]
Случается, что реализация интерфейса содержится во вложенном объекте класса. Тогда не требуется программировать реализацию интерфейса путем замыкания каждого метода интерфеса на соответствующий метод вложенного объекта. Достаточно делегировать реализацию интерфейса вложенному объекту с помощью директивы implements:
[/q]
type
 
[pascal]
 TTextParser = class(TInterfacedObject, ITextReader)
    ...
    FTextReader: ITextReader;
    property TextReader: ITextReader read FTextReader implements ITextReader;
    ...
  end;

[/pascal]
[cs]
В этом примере интерфейс ITextReader в классе TTextParser реализуется не самим классом, а его внутренней переменной FTextReader.

Очевидно, что внутренний объект должен быть совместим с реализуемым интерфейсом.



Вот это было бы интересно и ближе к множественному наследованию.

При этом можно делать автоматические обертки по образу и подобиb fody PropertyChanged

https://github.com/Fody/PropertyChanged
и солнце б утром не вставало, когда бы не было меня
Re[4]: [Ann] Next big thing in c#: default interface methods
От: VladiCh  
Дата: 06.04.17 01:32
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>Здравствуйте, VladD2, Вы писали:


S_S>Собирать из кусочков хорошо, только вот бы еще одну фичу из С++ — private наследование интерфейсов. Почему не предлагают, не уж то это только мне требуется?

S_S>Уже не мало классов пришлось написать, которым в конструктор передается по 3-4 делегата, кроме прочего.
S_S>Можно было бы один интерфейс передать. Но как его реализовывать в классе-клиенте этой штуки, если используется приватно, и нельзя поганить класс-клиент публичным наследованием?
S_S>Альтернатива только в классе-клиенте private nested класс делать, в нем интерфейс реализуется, методы интерфейса вызывают поля-делегаты, эти поля заполняются классом-клиентом. Хотя бы так сделали без изменения CLR.

Это с самых первых версий есть в VB.NET. Можно просто использовать вместо C# где необходимо .
Re[5]: [Ann] Next big thing in c#: default interface methods
От: AngeL B. Россия  
Дата: 07.04.17 09:04
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

HH>>Если кто-то хочет дефолтную реализацию, сделали бы для них ключевое слово trait.

S>И сломали бы неизвестное количество проектов, где есть переменные и мемберы с именем trait?

Вот самая из натянутых отговорок, честно.
С современными средами разработки и методами рефакторинга это наименьшая из проблем.
Могли бы ключ компилятора в конце концов сделать какой или еще чего.
Re[6]: [Ann] Next big thing in c#: default interface methods
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.04.17 11:16
Оценка: +1
Здравствуйте, AngeL B., Вы писали:

AB>Вот самая из натянутых отговорок, честно.

Это вам кажется.
AB>С современными средами разработки и методами рефакторинга это наименьшая из проблем.
И это вам кажется. Далеко не всегда есть возможность поправить исходник.
AB>Могли бы ключ компилятора в конце концов сделать какой или еще чего.
А это — вообще тупик. С тем же успехом можно просто не выпускать фичу. Стоимость тестирования возрастает на ровном месте вдвое: ведь нам надо проверить, что все тесты работают корректно с обоими ключами компилятора.
При этом те, кому нужен ключ, по факту не применяют новую фичу совсем — т.е. ездят на старой версии компилятора.
Ведь в шарпе нет частичной компиляции — то есть если у нас "сломан" один файл в проекте, то отключить фичу придётся во всём проекте.
Вы бы почитали блоги Липперта, что ли. Он там очень много вещей подробно обсуждает с точки зрения команды компилятора.

Очень легко принимать такие решения, когда у твоего продукта полтора человека пользователей, или ты опенсорсник, которому наплевать на свою аудиторию, и никаких обязательств у тебя перед ними нет.
А когда ты работаешь в коммерческой компании, то backwards compatibility становится ночным кошмаром.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: [Ann] Next big thing in c#: default interface methods
От: Max Mustermann  
Дата: 07.04.17 13:07
Оценка:
Здравствуйте, Sinclair, Вы писали:

AB>>Вот самая из натянутых отговорок, честно.

S>Это вам кажется.

Ок, мне тоже "кажется".
Раскройте еще раз эти же тезисы применительно к yeld, var, await, dynamic, from, foreach...
Re[7]: [Ann] Next big thing in c#: default interface methods
От: artelk  
Дата: 07.04.17 13:22
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Очень легко принимать такие решения, когда у твоего продукта полтора человека пользователей, или ты опенсорсник, которому наплевать на свою аудиторию, и никаких обязательств у тебя перед ними нет.

S>А когда ты работаешь в коммерческой компании, то backwards compatibility становится ночным кошмаром.

https://msdn.microsoft.com/en-us/library/hh678682(v=vs.110).aspx
Вот тут список ломающих изменений, которые, имхо, с большей вероятностью ломают обратную совместимость случайного кода в вакууме. И ничего, включили их.
Re[9]: [Ann] Next big thing in c#: default interface methods
От: artelk  
Дата: 07.04.17 13:31
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>В текущем C# это компилируется Ок:

S>
S>public class Test
S>{
S>    public class trait { }
S>    public trait IFoo { get; set;}
S>}
S>

S>Попробуйте заставить это скомпилироваться в вашем гипотетическом C# с ключевым словом trait.

class var{
  public static implicit var(int n){...}
}
//...

var x = 42;

так же и поступать — если в области видимости есть такой тип — считать, что имеется ввиду он.
Re[2]: [Ann] Next big thing in c#: default interface methods
От: artelk  
Дата: 07.04.17 14:49
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, Sinix, Вы писали:


Doc>Блин. Вот чего меньше всего хотелось это увидеть код имплементации в интерфейсе.

Doc>Зачем мешать контракт и реализацию? Печаль

Контракт это не обязательно только безликие сигнатуры. В него так же могут быть включены некоторые дополнительные утверждения, нарушив которые ты нарушаешь LSP.
Поэтому народ придумывает всякие code contracts и т.п. Часть таких утверждений можно закодировать в виде дефолтных реализаций или методах расширения.
Например, утверждение, что для чисел выполняется x-y==x+(-y), поэтому бинарный минус можно реализовать через унарный и операцию сложения.
Но если его сделать методом расширения, ты теряешь возможность реализовать его более эффективным способом для BigInteger.
Или вот:
interface IEnumerable<T>
{
  //...
  bool Contains(T value)
  {
    foreach(var item in this)
    {
      if(item == value)
        return true;
    }

    return false;
  }
}

class HashSet<T>: IEnumerable<T>, ISet<T>
{
  bool Contains(T value)
  {
    //более эффективная реализация, но с тем же результатом
  }
}

void Do(IEnumerable<T> items)
{
  b = items.Contains(...);
  //вместо такого:
  if(items is ISet<T>)
    b = (ISet<T>)items.Contains(...);
  else if(items is SomethingElseThatIsSupposedToHaveEffectiveContains<T>)
    b = ...
}



https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/First.cs
https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Count.cs
https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Skip.cs
...
Кучу извращий можно было бы избежать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.