在继承类中是否可以重写抽象父类的嵌套类定义?

3

上下文

我有一个场景,在其中希望定义多个Bar类,每个类都必须定义自己的RequestResponseError类。因此,我编写了一个抽象的Foo类,意在强制实现。

RequestResponseError共享一个基类PDU,并且必须实现各自的接口。每个Bar需要一个足够独特的RequestResponseError,因此它们必须被单独定义。

此外,每个BarRequestResponseError不应该在Bar之外实例化,因此似乎正确(至少对我来说)应该将类定义嵌套。

问题

是否可以在继承自抽象父类的子类中覆盖嵌套类定义?或者通过另一种方法实现同样的效果?

非法示例

以下是我想要编写的非法代码示例:

public abstract class Foo
{
    public class Request: PDU, IRequest
    { }

    public class Response : PDU, IResponse
    { }

    public class Error : PDU, IException
    { }
}

public class Bar : Foo
{
    public override Request
    {
        // Definition of Request goes here
    }

    public override Response
    {
        // Definition of Response goes here
    }

    public override Error
    {
        // Definition of Error goes here
    }
}

嵌套类层次结构?为什么不使用单独的程序集和内部类呢? - Dennis
3
听起来你更想要暴露一个接口而不是覆盖嵌套类。 - DavidG
@Dennis,我想我是在遵循"当封闭类只对封装类有用时"嵌套使用类的建议,而且可能会有(我还不确定)嵌套类需要访问封装类的私有成员变量的情况。虽然这种方法可能是错误的,你传统的建议可能更加适合。 - George Kerwood
你想如何使用那些类?提供一个情景会更有帮助。请详细说明你想要 实现 什么,而不是你认为可能的解决方案。 - MakePeaceGreatAgain
将一个类嵌套在另一个类中并不会真正限制其访问 - 它更像是另一个命名空间。嵌套类中的所有公共内容也可以通过外部类名称访问到,因此您也可以从Bar中访问Foo.Request - MakePeaceGreatAgain
显示剩余2条评论
2个回答

4

无法覆盖嵌套类,因此您目前的方法不起作用。不过,我认为这就是你想要实现的。

我的建议是使用接口和泛型。假设您有三个接口:

public interface IRequest
{
    //snip
}
public interface IResponse
{
    //snip
}

public interface IException
{
    //snip
}

现在,您可以将基类编写成如下形式:

public abstract class BaseThing<TRequest, TResponse, TError>
    where TRequest : IRequest
    where TResponse : IResponse
    where TError : IException
{
    // An example method
    public abstract TResponse GetThing(TRequest request);
}

现在你可以对上述事物进行一些具体的定义:

public class FooRequest : IRequest
{
    //snip
}

public class FooResponse : IResponse
{
    //snip
}

public class FooError : IException
{
    //snip
}

public class FooThing : BaseThing<FooRequest, FooResponse, FooError>
{
    public override FooResponse GetThing(FooRequest request)
    {
        //snip
    }
}

这正是我需要的替代方案,非常感谢。我的想法主要是为了封装和结构而不是功能。我应该能够通过访问修饰符和命名空间实现相同的效果。 - George Kerwood

1
由于Request、Response和Exception类非常特定于每个Bar类,因此它看起来不像是一个“类”的情况。你只需要接口IRequest、IResponse和IException。
在每个“Bar”类中实现这些接口,并为接口中的方法提供类特定的实现。这样就没有派生类的问题,常规继承原则将起作用。
剩下的问题是是否从PDU类继承 - PDU类是否包含任何实现?还是它是一个抽象类?如果它没有任何实现,它可以转换为一个接口,可以由Bar类实现。
如果它包含实现,每个Bar类可以创建一个PDU类的实例,以供实现IRequest/IResponse/IException的方法使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接