C # вопрос о перегрузке - PullRequest
2 голосов
/ 27 апреля 2011

Можно ли как-то реализовать следующую схему:

public interface ISomething
{
    void Go(ISpecific specific);

    void Go(Object o);
}

, чтобы при каждом вызове Go(ISpecific) вызывалась первая перегрузка, а для вызовов с любыми другими возможными объектами класс Откат к реализации Go(Object)?

Ответы [ 4 ]

5 голосов
/ 27 апреля 2011

Так будет работать по умолчанию, но с использованием типов время компиляции . Если у вас есть Go(foo), а тип времени компиляции foo не реализует ISpecific, он вызовет второй метод, даже если объект, на который ссылается foo, во время выполнения реализует ISpecific. Если вы хотите, чтобы это решение принималось динамически в время выполнения , и если вы используете C # 4, вы можете написать:

dynamic value = GetValue();
something.Go(value);

... и во время выполнения будет выбрана правильная перегрузка.

5 голосов
/ 27 апреля 2011

Да. Так работает компилятор.

3 голосов
/ 27 апреля 2011

Да, это возможно. Обратите внимание, что решение о том, какую перегрузку принять, будет приниматься на основе типа времени компиляции ссылки.

ISpecific specificVar = null;
something.Go(specificVar);  // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj);  // ISomething::Go(object)
0 голосов
/ 27 апреля 2011

Да, это определенно работает, любой объект, который не является ISpecific, будет вызывать перегрузку объекта.

Я написал консольное приложение для проверки.

оно выводит

Object 
Object
Specific

class Program
{
    static void Main()
    {
        Object aSpecific = new Object();
        String nonSpecific = "nonSpecific";
        ISpecific specific = new Specific();

        ISomething something = new Something();

        something.Go(aSpecific);
        something.Go(nonSpecific);
        something.Go(specific);

        Console.ReadKey();
    }
}

interface ISpecific
{
    void GoGo();
}

interface ISomething
{
    void Go(ISpecific specific)
    void Go(Object o)
}

Class Specific : ISpecific
{
    public Specific() { }

    public void GoGo()
    {
         Console.WriteLine("Specific");
    }
}

Class Something : ISomething
{
    public Something() { }

    public void Go(ISpecific specific)
    {
        specific.GoGo()
    }

    public void Go(Object o)
    {
        Console.WriteLine("Object");
    }
}
...