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.
Несоответствие не очень радует.
Ну и конечно вопрос, как должен компилятор себя вести ?
Здравствуйте, _NN_, Вы писали:
_NN>Конечно 'override' в интерфейсах нельзя ставить, но советуется
Сообщение ошибочное. Надо создавать ишью и править.
Что касается твой ситуации, то она бессмысленная. Это фактически баг. И даже хорошо, что немерл о нем сообщает.
Здравствуйте, 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' не играет никакой роли.