在覆盖期间将 return 类型更改为派生类型

Change return type to derived type during override

我想要接口 A。这将允许类型 A 的对象生成其他类型 A 的对象。 我需要类型 B 的相同行为。在我的应用程序中,所有 B 也是 A。所以我希望 B 派生自 A。

这是我的尝试:

public interface A {
    A method1();
}
public interface B : A {
    overrride B method1();
    void otherMethod();
}

请注意,override 关键字不会在此处编译。使项目编译的唯一方法是使界面 B 如下所示:

public interface B : A {
    //A method1(); /* commented out because it is inherired */
    void otherMethod();
}

但是我想通过接口 B 保证,这种类型的对象有方法来生成其他类型 B 的对象。

接口 B 的实现可能如下所示:

class Foo : B {
    B metod1();
}

我希望 B metod1() 从接口 B 实现 B method1(),我也希望相同的方法从接口 A 实现 A method1()。我期望相同的行为在所有 类 实现接口 B 中。所以我不想为两个接口每次都实现方法 1 两次。

我在 c# 中使用接口执行此操作。但我相信即使 类 也可能在 Java.

中,类似的问题也会很有趣

当然可以,在这里使用 new 关键字,而不是重写并显式实现重写的接口。

编辑: 根据您的意见调整样本。您仍然需要显式接口实现 IFoo IFoo.GetData() { return GetData(); },但是这个接口本身没有代码,因为它只是调用隐式实现 public INewFoo GetData() { return new Foo(); }.

这是一个例子:

public interface IFoo
{
    IFoo GetData();
}

public interface INewFoo : IFoo
{
    new INewFoo GetData();
}

public class Foo : INewFoo
{
    IFoo IFoo.GetData() { return GetData(); }
    public INewFoo GetData() { return new Foo(); }
}

正确执行此操作的唯一方法是使用如下泛型:

public interface A<T> where T : A<T>
{
    T method1();
}

然后 B 看起来像这样:

public interface B : A<B>
{
    void otherMethod();
}

最后,实现 class 会像这样:

public class Bravo : B
{
    public B method1() { return null; }
    public void otherMethod() { }
}

但是,您可以使用 new 关键字来隐藏接口中的方法,但这不是一个好主意,因为它会破坏正常的继承,因此更难推理您的代码。

试试这个:

public interface A
{
    A method1();
}

public interface B : A
{
    new B method1();
    void otherMethod();
}

public class Bravo : B
{
    A A.method1()  { return null; }
    public B method1() { return null; }
    public void otherMethod() { }
}