是否可以在继承 class 中覆盖抽象父项的嵌套 class 定义?

Is it possible to override the nested class definition of an abstract parent, within an inheriting class?

上下文

我有一个场景,我希望定义几个 Bar class,每个都必须定义 RequestResponseError class他们自己的。为此,我写了一个摘要Foo class,意图强制实施。

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

此外,每个 BarRequestResponseError 不应在 Bar 之外实例化,所以它看起来是正确的(至少对我来说)class 定义应该是嵌套的。

问题

是否可以覆盖从抽象父项继承的子项中的嵌套 class 定义?或者至少通过另一种方法实现同样的目标?

非法示例

下面是我希望如何编写的非法代码示例:

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
    }
}

无法覆盖嵌套 class,因此您当前的方法行不通。但是,我认为这就是您要实现的目标。

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

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

public interface IException
{
    //snip
}

现在你可以让你的基地 class 看起来像这样:

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
    }
}

由于 classes 请求、响应和异常对于每个 Bar class 都是非常具体的,因此看起来不像 'class' 的情况。您只需要接口 IRequest、IResponse、IException。

在每个 'Bar' class 中实现这些接口,并为接口中的方法提供 class 具体实现。这样派生的 classes 就没有问题,常规继承原则将起作用。

剩下的就是从 PDU class 继承的问题 - PDU class 是否包含任何实现?还是抽象的class?如果它没有任何实现,它可以转换成一个接口,可以由 Bar classes.

实现

如果它包含实现,每个 Bar class 可以创建一个 PDU class 实例供实现 IRequest/IResponse/IException.

的方法使用