Объявите функцию, поддерживающую как Void, так и IEnumerator - PullRequest
1 голос
/ 16 марта 2012

Мне было интересно, есть ли способ объявить метод (например, в интерфейсе), который поддерживает использование IEnumerator и Void, без необходимости реализовывать оба в подклассах?

public void Start()
public IEnumerator Start()

это связано с моим другим вопросом: Удерживайте или ждите, пока Coroutine завершит

Я заметил, что в контексте Unity, метод Start() по умолчанию, кажется, допускает и то и другое.

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Одно имя функции + комбинация параметров могут быть объявлены только один раз, поэтому может иметь только один выход.

2 голосов
/ 16 марта 2012

Вы не можете сделать это, потому что эти методы будут иметь одинаковую сигнатуру, и CSC не сможет определить, какой метод должен быть статически связан для каждого вызова.Например:

public class TestClass
{
    public int FooMethod()
    {
        return 1;
    }
    public void FooMethod()
    {
        return;
    }
    public string FooMethod()
    {
        return "foo";
    }
}

static void Main()
{
    TestClass test = new TestClass();

    Console.WriteLine(test.FooMethod()); // which FooMethod should be called here?
}

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

Случай с интерфейсами аналогичен.когда класс реализует интерфейс, он соглашается с протоколом, что он реализует поведение этого интерфейса, которое ожидают потребители вашего класса.Таким образом, вы не можете частично согласиться с интерфейсом.Хотя вы можете выдать NotImplementedException в ваших реализациях, вы должны как минимум определить всех членов, что приводит к той же проблеме, упомянутой в приведенном выше примере: компилятор C # не сможет статически связывать ваш методзвонки и ваш код не будет компилироваться.

Вы можете решить свою проблему, пересмотрев свой дизайн.

2 голосов
/ 16 марта 2012

Короткий ответ - нет.

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

public T Start()
...