Перегрузка методов + наследование в C#
От: zelych  
Дата: 01.09.07 10:20
Оценка:
    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)

Интересно, зачем это сделано и где в стандарте такое поведение описано?
Re: Перегрузка методов + наследование в C#
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.09.07 14:49
Оценка:
Здравствуйте, zelych, Вы писали:

Z>Интересно, зачем это сделано и где в стандарте такое поведение описано?


Это несколько раз обсуждалось на форуме. Посмотрите, например, здесь
Автор: nikov
Дата: 20.06.07
и здесь
Автор: nikov
Дата: 23.03.07
.
Если после прочтения тех топиков будут еще вопросы, пишите.
Re[2]: Перегрузка методов + наследование в C#
От: zelych  
Дата: 02.09.07 09:38
Оценка:
Здравствуйте, nikov, Вы писали:
N>Если после прочтения тех топиков будут еще вопросы, пишите.

За ссылку на стандарт спасибо, я не сомневался что такое поведение где-то описано, только не мог найти где.
Остаётся вопрос зачем.
Очень неочевидное поведение (или непривычное, по крайней мере).
Re[3]: Перегрузка методов + наследование в C#
От: nikov США http://www.linkedin.com/in/nikov
Дата: 02.09.07 10:14
Оценка:
Здравствуйте, 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.


Так что, с этим вопросом не все так однозначно, и он является предметом спора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.