サブクラスで両方を実装する必要なく、IEnumerator と Void の使用をサポートするメソッドを (たとえばインターフェイスで) 宣言する方法があるかどうか疑問に思っていましたか?
public void Start()
public IEnumerator Start()
これは私の他の質問に関連しています:コルーチンが終了するまで保留または待機
Unity のコンテキストで気づいたのですが、デフォルトのStart()
方法では両方が許可されているようです。
サブクラスで両方を実装する必要なく、IEnumerator と Void の使用をサポートするメソッドを (たとえばインターフェイスで) 宣言する方法があるかどうか疑問に思っていましたか?
public void Start()
public IEnumerator Start()
これは私の他の質問に関連しています:コルーチンが終了するまで保留または待機
Unity のコンテキストで気づいたのですが、デフォルトのStart()
方法では両方が許可されているようです。
短い答えはノーです。
これに最も近いのはジェネリックを使用することですが、それはボイドでは機能しません。申し訳ありません。
public T Start()
1 つの関数名 + パラメーターの組み合わせは 1 回しか宣言できないため、1 つの出力しか持つことができません。
これらのメソッドは同じ署名を持ち、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# コンパイラはメソッド呼び出しを静的にバインドできず、コードはコンパイルに失敗します。
設計を再考することで問題を解決できます。