是否可以在继承 class 中覆盖抽象父项的嵌套 class 定义?
Is it possible to override the nested class definition of an abstract parent, within an inheriting class?
上下文
我有一个场景,我希望定义几个 Bar
class,每个都必须定义 Request
、Response
和 Error
class他们自己的。为此,我写了一个摘要Foo
class,意图强制实施。
Request
、Response
和 Error
共享一个基础 class、PDU
,并且必须实现各自的接口。每个 Bar
都需要足够独特的 Request
、Response
和 Error
,因此它们必须独立定义。
此外,每个 Bar
的 Request
、Response
和 Error
不应在 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.
的方法使用
上下文
我有一个场景,我希望定义几个 Bar
class,每个都必须定义 Request
、Response
和 Error
class他们自己的。为此,我写了一个摘要Foo
class,意图强制实施。
Request
、Response
和 Error
共享一个基础 class、PDU
,并且必须实现各自的接口。每个 Bar
都需要足够独特的 Request
、Response
和 Error
,因此它们必须独立定义。
此外,每个 Bar
的 Request
、Response
和 Error
不应在 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.
的方法使用