我想有交集A.这将允许A类对象生成A类型的其他对象。 对于类型B,我需要相同的行为。在我的应用程序中,所有B也都是A.所以我希望B从A派生。
这是我的尝试:
public interface A {
A method1();
}
public interface B : A {
overrride B method1();
void otherMethod();
}
请注意,覆盖关键字dosn在这里编译。使项目编译的唯一方法是使接口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的类。所以我不想每次两次为两个接口实现method1。
我在c#中使用接口执行此操作。但我相信类似的问题即使是课程也可能很有趣,也可能是Java。
答案 0 :(得分:2)
正确执行此操作的唯一方法是使用这样的泛型:
public interface A<T> where T : A<T>
{
T method1();
}
然后B
看起来像这样:
public interface B : A<B>
{
void otherMethod();
}
最后,实现一个类就是这样:
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() { }
}
答案 1 :(得分:-1)
确定可行,请在此处使用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(); }
}