1

我想知道是否有一种方法可以声明一个支持使用 IEnumerator 和 Void 的方法(例如在接口中),而无需在子类中实现这两者?

public void Start()
public IEnumerator Start()

这与我的另一个问题有关:协程完成时保持或等待

我注意到在 Unity 上下文中,默认Start()方法似乎允许两者。

4

3 回答 3

2

最简洁的答案是不。

最接近这一点的方法是使用泛型,但是这不适用于 void,抱歉。

public T Start()
于 2012-03-16T05:48:39.217 回答
2

一个函数名+参数组合只能声明一次,因此只能有一个输出。

于 2012-03-16T05:50:04.227 回答
2

您不能这样做,因为这些方法将具有相同的签名,并且 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,您始终可以选择不使用原始方法返回的结果。

接口的情况类似。当一个类实现一个接口时,它同意一个协议,它实现了该接口的行为,这是您的类的消费者所期望的。所以你不能部分同意一个接口。虽然你可以在你的实现中抛出 a ,但NotImplementedException你至少必须定义所有成员,这会导致上面示例中提到的相同问题:C# 编译器将无法静态绑定你的方法调用,并且你的代码将无法编译。

您可以通过重新考虑您的设计来解决您的问题。

于 2012-03-16T05:56:57.027 回答