c# - OOP将孩子转换为父母并返回
问题描述
我有一个关于 OOP 的一般性问题,我在程序中找到了以下代码(显示为示例)。这里期望一个父类作为参数,但是传递了一个子类,然后将其从父类型转换回子类型我是认为这种来回转换是否违反OOP规则的人?
private void OnSend (BaseParameters obj) {
var request = commandBuilder.BuildCommand (obj);
_controller.ReceiveRequest (request);
}
public BaseCommand BuildCommand (BaseParameters parameters) {
switch (parameters) {
case ParametersCopy parametersCopy: //Give a base parameter and cast to spezific child parameter
{
return = new CommandCopy (parameters.XY.parameters.ZX)
}
case ParametersDelete parametersDelete:
{
return new CommandDelete (parameters.XY.parameters.ZX);
}
}
}
//Await a Base command but a child command is passed
public void ReceiveRequest (BaseCommand cmd) {
CommandQueue.AddCmd (cmd);
}
public void ReceiveEndlessRequest (BaseCommand cmd, CancellationToken cancellationToken) {
while (!cancellationToken.IsCancellationRequested) {
var newPram = cmd.Clone ();
ReceiveRequest (newPram);
}
}
这段代码仍然有效,因为 C# 只给对象一个 refrenze。因此,您可以将它们从父 co 孩子转换回来。
我的问题是,如果我在“ReviceRequest”中给出一个纯基本命令,我的应用程序就会崩溃,因为内部使用了特定的命令
我的“ReviceEndlessRequest”功能不再起作用。由于复制是在基本类型上执行的,因此所有子属性都将丢失。但是由于“ReviceRequest”需要基本类型,所以一切似乎都很好。但是应用程序支持它,因为缺少参数。
在我看来,这违反了 OOP 规则。我期望一个 BaseType 并且应用程序在内部使用 childType
在我看来,在 BuildCommand 中转换参数也是错误的。你怎么看?
解决方案
您在代码中看到的行为是由于多态性造成的。如您所知,多态性表明一件事有多种形式。所以在你的情况下,CopyCommand 或 DeleteCommand 是 Command 的一种形式。
BaseCommand 确实会导致错误,因为它是一种抽象形式的命令。它具有由其子类实现的任何抽象方法。
BuildCommand 方法是一种工厂方法,它根据您提供的输入构造您的命令。
推荐阅读
- swiftui - 访问包含对象数组的 environmentObject 时,画布预览不显示
- c++ - 函数参数中的 C++ 数组指针
- android - 在Android中将本机堆中的数据写入磁盘
- java - 从 MATLAB 调用 java.io.File(CurrPath) 需要很长时间
- single-sign-on - Keycloak:外部 IdP 的 SAML 响应无效
- java - HttpURLConnection 在发送 GET 请求后返回响应代码 500,即使它在本地工作也是如此
- r - 使用 ggplot 在一个图中绘制多个直方图
- logstash - Logstash 将文本过滤成 json 格式
- android - TFlite GPUDelegateV2 初始时间长
- android - 管理多模块 Android 库的最佳方式是什么?