Re[2]: Ковариантность по возвращаемому значению в виртуальных методах.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.02.13 07:45
Оценка: -1
Здравствуйте, Jack128, Вы писали:

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


J>Хз, можно ли это красиво сделать без правок в CLR, но фича полезная и логичная была бы.



J>
J>class CollectionItem {}
J>class Collection 
J>{
J>    protected virtual CollectionItem CreateItem() {...}
J>}



J>class MyCollectionItem: CollectionItem {}
J>class MyCollection 
J>{
J>    protected override MyCollectionItem CreateItem() {...}
J>}
J>


J>В Java есть, AFAIR.


А зачем? Что мешает возвращать MyCollectionItem, там где требуется CollectionItem ? Вариантность вообще-то к дженерикам относится. А тут непонятно что.
Re[4]: Что нужно добавить в C#?
От: hardcase Пират http://nemerle.org
Дата: 21.02.13 07:52
Оценка:
Здравствуйте, k0st1x, Вы писали:

K>спасибо : ) не знал про этот странный нюанс.

K>но все равно есть, что улучшать : )
K>было бы здорово, чтобы вообще без дополнительного вызова.

Этого вызова по факту не существует.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Ковариантность по возвращаемому значению в виртуальных методах.
От: Jack128  
Дата: 21.02.13 07:53
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>А зачем? Что мешает возвращать MyCollectionItem, там где требуется CollectionItem ?

Не что не мешает. Точно так же как ничто не мешает в наследнике MyCollection2: MyCollection в CreateItem вернуть CollectionItem. А по идее — компилятор должен мешать.

G>Вариантность вообще-то к дженерикам относится.

Перечитал несколько раз. Слова generics — не нашел. Только абстрактное "operation".
Re[4]: Что нужно добавить в C#?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.13 07:55
Оценка:
Здравствуйте, k0st1x, Вы писали:

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


S>>Можно

S>>
S>>  public string Name {get; set;}
S>>  public Foobar(string name): this() {
S>>    Name = name;
S>>  }
S>>


K>спасибо : ) не знал про этот странный нюанс.

Ничего странного. Если рассахарить и ввести поле, то компилятор точно так же не дает обращаться к сеттеру свойства, пока не будут проиницилизированы все поля. Либо явно инициализируем введенное поле, либо неявно (вызываем конструктор по умолчанию).
K>но все равно есть, что улучшать : )
K>было бы здорово, чтобы вообще без дополнительного вызова.
Уверен что дополнительного вызова нет.
Re[4]: Что нужно добавить в C#?
От: Аноним  
Дата: 21.02.13 07:59
Оценка:
Здравствуйте, matumba, Вы писали:


M>Можно не вводить, если реализуют паскалевский with.


Паскалевский with скорее зло, чем благо. Особенно когда они вложены друг в друга.
Реально что в паскале удобнее, чем в c#:
1. это явное приведение типов не (Type)exp, а Type(exp)
2. очень не хватает множеств set и операций с ними в приятном синтаксисе, а не вызове методов класса.
Re[5]: Что нужно добавить в C#?
От: Цыба Украина  
Дата: 21.02.13 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Паскалевский with скорее зло, чем благо. Особенно когда они вложены друг в друга.


Как и в JavaScript, потому что к with нет явной привязки к контексту. В VB.NET, как я понимаю, привязка есть.
Re[4]: Ковариантность по возвращаемому значению в виртуальных методах.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.02.13 08:04
Оценка:
Здравствуйте, Jack128, Вы писали:

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


G>>А зачем? Что мешает возвращать MyCollectionItem, там где требуется CollectionItem ?

J>Не что не мешает. Точно так же как ничто не мешает в наследнике MyCollection2: MyCollection в CreateItem вернуть CollectionItem. А по идее — компилятор должен мешать.
Кому должен? Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.
Вообще есть вероятность нарушения LSP при таком поведении.

G>>Вариантность вообще-то к дженерикам относится.

J>Перечитал несколько раз. Слова generics — не нашел. Только абстрактное "operation".

http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.
Re[5]: Ковариантность по возвращаемому значению в виртуальных методах.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.13 08:09
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.


object obj = 1;

вот это уже ковариантность.
object[] = new int[] { 1 };

И это тоже. Дженериков нет, ковариантность есть.
Re[6]: Ковариантность по возвращаемому значению в виртуальных методах.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.13 08:12
Оценка:
S>
S>object[] = new int[] { 1 };
S>

S>И это тоже.
Тут я немного нагнал, нужны reference типы. Для строк работает, для int-ов — нет.
Re[5]: Ковариантность по возвращаемому значению в виртуальных методах.
От: Jack128  
Дата: 21.02.13 08:34
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


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


G>>>А зачем? Что мешает возвращать MyCollectionItem, там где требуется CollectionItem ?

J>>Не что не мешает. Точно так же как ничто не мешает в наследнике MyCollection2: MyCollection в CreateItem вернуть CollectionItem. А по идее — компилятор должен мешать.
G>Кому должен?
программисту.

G>Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.

G>Вообще есть вероятность нарушения LSP при таком поведении.
"такое поведение" — это поведение MyCollection2? естественно нарушит LSP. И именно этого и поможет избежать предлагаемая фича.


G>>>Вариантность вообще-то к дженерикам относится.

J>>Перечитал несколько раз. Слова generics — не нашел. Только абстрактное "operation".

G>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.

а какой реальности идет речь, если вариантность — понятие из абстрактной математики? то что ты в курсе только о вариантности делегатов и интерфейсов не означает, что это понятие нельзя применить к другим "операциям".
Re[6]: Ковариантность по возвращаемому значению в виртуальных методах.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.02.13 12:09
Оценка:
Здравствуйте, Jack128, Вы писали:

G>>Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.

G>>Вообще есть вероятность нарушения LSP при таком поведении.
J>"такое поведение" — это поведение MyCollection2? естественно нарушит LSP. И именно этого и поможет избежать предлагаемая фича.
Как она поможет избежать? Примером кода пожалуйста.


G>>>>Вариантность вообще-то к дженерикам относится.

J>>>Перечитал несколько раз. Слова generics — не нашел. Только абстрактное "operation".

G>>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.

J>а какой реальности идет речь, если вариантность — понятие из абстрактной математики? то что ты в курсе только о вариантности делегатов и интерфейсов не означает, что это понятие нельзя применить к другим "операциям".
Ты прочитал то статью? Как относится вариантность к тому что ты пишешь?
Re[6]: Ковариантность по возвращаемому значению в виртуальных методах.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.02.13 12:41
Оценка:
Здравствуйте, samius, Вы писали:

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


G>>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.


S>
S>object obj = 1;
S>

S>вот это уже ковариантность.
Да ну? А где здесь функтор?

S>
S>object[] = new int[] { 1 };
S>

S>И это тоже. Дженериков нет, ковариантность есть.
Array всегда был недодженериком. И эта ковариантность очень опасна, ведь можно сделать так:
object[] x = new int[] { 1 };
x[0] = new object(); //Ахтунг
Re[7]: Ковариантность по возвращаемому значению в виртуальных методах.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.13 12:46
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


S>>
S>>object obj = 1;
S>>

S>>вот это уже ковариантность.
G>Да ну? А где здесь функтор?

А зачем функтор?

S>>И это тоже. Дженериков нет, ковариантность есть.

G>Array всегда был недодженериком. И эта ковариантность очень опасна, ведь можно сделать так:
G>
G>object[] x = new int[] { 1 };
G>x[0] = new object(); //Ахтунг
G>

Тем не менее, ковариантность массивов — формальная фича C# 1.0
Re[8]: Ковариантность по возвращаемому значению в виртуальных методах.
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.02.13 12:53
Оценка:
Здравствуйте, samius, Вы писали:

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


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


S>>>
S>>>object obj = 1;
S>>>

S>>>вот это уже ковариантность.
G>>Да ну? А где здесь функтор?

S>А зачем функтор?

А что такое вариантность вообще?
Re[9]: Ковариантность по возвращаемому значению в виртуальных методах.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.13 13:01
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


S>>>>вот это уже ковариантность.

G>>>Да ну? А где здесь функтор?

S>>А зачем функтор?

G>А что такое вариантность вообще?
Это смотря где.
А в контексте программирования под ковариантностью и контрвариантностью подразумевают взаимозаеняемость и эквивалентность типов в определенных ситуациях на основе отношений типов (частное/общее).
Re[2]: Что нужно добавить в C#?
От: alexzz  
Дата: 21.02.13 13:13
Оценка:
Здравствуйте, matumba, Вы писали:

M>Приведение типов неуклюжее. Вместо
double z = (double)IntVar;
можно было б писать
double z := IntVar;
, т.е. := — это "присвоить с приведением типа к lvalue". Словесный понос надо искоренять — пусть паскалисты его тыркают.



Я не понял, почему нельзя так написать?

double z = intVar;
Re[5]: Что нужно добавить в C#?
От: Aлeкceй  
Дата: 21.02.13 13:41
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Ты не прав. Я вчера утром про этот топик рассказал Мэдсу, и позже он говорил, что ждет когда я скомпилирую суммарный документ.


Вообще есть шанс, что хоть какие-нибудь наши хотелки реализуют?
Re[2]: Что нужно добавить в C#?
От: G-Host  
Дата: 21.02.13 13:45
Оценка:
Здравствуйте, Don Reba, Вы писали:

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


DR>Мне в Шарпе не хватает одной фичи из Немерле: foreach c индексатором, типа:


DR>
foreach (var x from collection with i)

DR>Здесь i номер текущей итерации.
в чем существенная польза? не так часто нужно, а если нужно то можно индексировать самому.
или я не так понял идею?
Re[7]: Ковариантность по возвращаемому значению в виртуальных методах.
От: Jack128  
Дата: 21.02.13 13:46
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

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


G>>>Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.

G>>>Вообще есть вероятность нарушения LSP при таком поведении.
J>>"такое поведение" — это поведение MyCollection2? естественно нарушит LSP. И именно этого и поможет избежать предлагаемая фича.
G>Как она поможет избежать? Примером кода пожалуйста.

class CollectionItem {}
class Collection
{
protected virtual CollectionItem CreateItem() {...}
}



class MyCollectionItem: CollectionItem {}
class MyCollection: Collection
{
protected override MyCollectionItem CreateItem() {...}
}

class MyCollection2: MyCollection
{
// protected override CollectionItem CreateItem() {...} так ошибка компиляции, так как CollectionItem не является MyCollectionItem, ковариантность нарушится. Раз не компилируется, то LSP не сможем нарушить.
protected override MyCollectionItem CreateItem() {...} // а так вполне можно.

}


G>>>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.

J>>а какой реальности идет речь, если вариантность — понятие из абстрактной математики? то что ты в курсе только о вариантности делегатов и интерфейсов не означает, что это понятие нельзя применить к другим "операциям".
G>Ты прочитал то статью? Как относится вариантность к тому что ты пишешь?

ну как, твоя статья описывает частные случаи вариантности, реализованные в C#. Какая вариантность бывает в других языках — можно на вики почитать.
Re[3]: Что нужно добавить в C#?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 21.02.13 14:04
Оценка:
Здравствуйте, G-Host, Вы писали:

GH>в чем существенная польза? не так часто нужно, а если нужно то можно индексировать самому.

GH>или я не так понял идею?

Мне не так уж и редко приходится оборачивать foreach в ручную реализацию for. Вот несколько сценариев:

foreach (var x in myEnum with i)
{
    if (i == 0)
        // ...
    else
        // ...
}

foreach (var x in myEnum with i)
    Console.WriteLine("{0,-2}: {1}", i + 1, x);

foreach (var x in myEnumwith i)
    DoSomething(x, myArray[i]);
Ce n'est que pour vous dire ce que je vous dis.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.