Наследование интерфейсов C# vs. Nemerle
От: _NN_ www.nemerleweb.com
Дата: 22.05.13 07:02
Оценка:
C#:
interface Q
{
    void F();
}

interface W : Q
{
    void F();
}

Все чисто.

Nemerle:
interface Q
{
    F() : void;
}

interface W : Q
{
    F() : void;
}


warning : N114: method W.F() : void hides method Q.F() : void inherited from base class. To make the current member override that implementation, add the `override' keyword. Otherwise add the `new' keyword.


Конечно 'override' в интерфейсах нельзя ставить, но советуется

Теперь обход проблемы:
Nemerle:
interface Q
{
  new F() : void;
}

interface W : Q
{
  new F() : void;
}

Все чисто.

C#:
interface Q
{
    new void F();
}

interface W : Q
{
    new void F();
}


warning CS0109: The member 'Q.F()' does not hide an inherited member. The new keyword is not required.


Несоответствие не очень радует.
Ну и конечно вопрос, как должен компилятор себя вести ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Наследование интерфейсов C# vs. Nemerle
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.05.13 09:53
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Конечно 'override' в интерфейсах нельзя ставить, но советуется


Сообщение ошибочное. Надо создавать ишью и править.

Что касается твой ситуации, то она бессмысленная. Это фактически баг. И даже хорошо, что немерл о нем сообщает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Наследование интерфейсов C# vs. Nemerle
От: matumba  
Дата: 23.05.13 13:26
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>warning : N114: method W.F() : void hides method Q.F()


По-идее, если сигнатура метода полностью совпадает, справедливо вылезает предупреждение (и никакие new/override не нужны — это глупо). А если не совпадает только тип возврата, это ошибка. Всё остальное допустимо.
Re[2]: Наследование интерфейсов C# vs. Nemerle
От: _NN_ www.nemerleweb.com
Дата: 27.05.13 06:01
Оценка: +1
Здравствуйте, matumba, Вы писали:

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


_NN>>warning : N114: method W.F() : void hides method Q.F()


M>По-идее, если сигнатура метода полностью совпадает, справедливо вылезает предупреждение (и никакие new/override не нужны — это глупо). А если не совпадает только тип возврата, это ошибка. Всё остальное допустимо.

Тип возврата ? При чем он ?
По вашему это некорректный код?
interface IA { F() : void; }
interface IB : IA { F() : int;}

Компилятор вполне его прожевал и не поперхнулся


Вы считаете , что поведение C# как раз нелогичное ?
В данном случае new ничего не меняет, а только убирает предупреждение.

Явная реализация интерфейса без 'new'.
using System.Console;
 
interface IA { F() : void; }
interface IB : IA { F() : void; }
 
class C : IB
{
 public FA() : void implements IA.F { WriteLine("A"); }
 public FB() : void implements IB.F { WriteLine("B"); }
}
 
module P
{
 Main() : void
 {
  def c = C();
  (c : IA).F();
  (c : IB).F();
 }
}

A
B


Если написать 'new F() : void' это ничего не изменит.

Аналогично при неявной реализации интерфейса 'new F() : void' не играет никакой роли.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.