class A {
public virtual void F (string s)
{
Console.WriteLine ("A.F (string)");
}
}
class B : A {
public override void F (string s)
{
Console.WriteLine ("B.F (string)");
}
static void Main (string[] args)
{
new B ().F ("string");
}
}
Получаем: B.F (string)
Добавляем в class B:
public void F (object s)
{
Console.WriteLine ("B.F (object)");
}
Получаем: B.F (object)
Интересно, зачем это сделано и где в стандарте такое поведение описано?
Здравствуйте, zelych, Вы писали:
Z>Интересно, зачем это сделано и где в стандарте такое поведение описано?
Это несколько раз обсуждалось на форуме. Посмотрите, например,
здесьАвтор: nikov
Дата: 20.06.07
и
здесьАвтор: nikov
Дата: 23.03.07
.
Если после прочтения тех топиков будут еще вопросы, пишите.
Здравствуйте, zelych, Вы писали:
Z>Остаётся вопрос зачем.
Z>Очень неочевидное поведение (или непривычное, по крайней мере).
Возможно авторы языка не хотели, чтобы переопределение (override) одного из унаследованных виртуальных методов, добавленное позже, могло внезапно повлиять на overload resolution уже существующих вызовов методов. Мне это кажется достаточно разумным.
Надо заметить, что в родственных (по крайней мере, по системе типов) языках VB.NET и Nemerle этот вопрос решается по-другому:
Module Program
Sub Main()
Dim x As New B
x.Foo("a")
End Sub
End Module
Class A
Public Overridable Sub Foo(ByVal x As String)
Console.WriteLine("A.Foo(String)")
End Sub
End Class
Class B
Inherits A
Public Overloads Sub Foo(ByVal x As Object)
Console.WriteLine("B.Foo(Object)")
End Sub
Public Overrides Sub Foo(ByVal x As String) ' Вызывается этот метод
Console.WriteLine("B.Foo(String)")
End Sub
End Class
По поводу Nemerle смотреть
здесь:
This is related to "exclude override" rule, which we found plainly wrong.
Так что, с этим вопросом не все так однозначно, и он является предметом спора.