【问题标题】:Is it possible to override the nested class definition of an abstract parent, within an inheriting class?是否可以在继承类中覆盖抽象父级的嵌套类定义?
【发布时间】:2021-03-22 18:02:54
【问题描述】:

上下文

我有一个场景,我希望定义几个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
    }
}

【问题讨论】:

  • 嵌套类层次结构?为什么不使用单独的程序集和内部类?
  • 听起来更像是你想公开一个接口而不是覆盖嵌套类。
  • 为什么要关心实现接口的类的名称?只需将PDU 的实例传递给任何需要请求、错误或响应的BL。您似乎使您的问题过于复杂,只是省略了所有这些讨厌的嵌套类并从头开始重新思考:您的实际类是什么以及它们有什么依赖关系?
  • @Dennis 我想我是在遵循使用嵌套类的建议“当封闭类仅对封闭类有用时”并且可能(我还不确定)场景中嵌套类可能需要访问封闭类的私有成员。当然,这可能是错误的方法,而您的传统建议可能更适合。
  • 你想如何使用这些类?这种情况会有很大帮助。请详细说明您想要实现的目标,而不是您认为可能的解决方案。

标签: c# inheritance overriding abstract-class


【解决方案1】:

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

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

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

【讨论】:

  • 这正是我需要的代替我的方法,谢谢。我的推理主要是为了遏制和结构而不是功能。我应该能够通过访问修饰符和命名空间来实现相同的目标。
【解决方案2】:

由于 Request、Response 和 Exception 类对每个 Bar 类都非常具体,因此它看起来不像“类”的情况。您只需要接口 IRequest、IResponse、IException。

在每个“Bar”类中实现这些接口,并为接口中的方法提供类特定的实现。这样派生类就没有问题了,常规继承原则会起作用。

剩下的问题是从 PDU 类继承的问题 - PDU 类是否包含任何实现?或者它是一个抽象类?如果没有实现,可以转换成Bar类可以实现的接口。

如果包含实现,则每个 Bar 类都可以创建一个 PDU 类的实例,供实现 IRequest/IResponse/IException 的方法使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2013-11-11
    • 2014-08-16
    • 2012-02-05
    • 1970-01-01
    • 2023-03-29
    • 2012-07-16
    相关资源
    最近更新 更多