在覆盖期间将 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() { }
}
我想要接口 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() { }
}