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

时间:2015-04-19 12:30:07

标签: c# class inheritance encapsulation

我想有交集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。

2 个答案:

答案 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(); }
}