C# OOP将子级转换为父级并返回

C# OOP将子级转换为父级并返回,c#,oop,C#,Oop,我有一个关于OOP的一般性问题 我在一个程序中发现了以下代码(如示例所示)。 这里需要一个父类作为参数,但传递一个子类,然后将其从父类型转换回子类型 我认为这种来回转换是否违反OOP规则 private void OnSend (BaseParameters obj) { var request = commandBuilder.BuildCommand (obj); _controller.ReceiveRequest (request); } public BaseCo

我有一个关于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。因此,您可以将它们从父-辅-子转换回来

我的问题是,如果我在“ReviceRequest”中给出一个纯基命令,我的应用程序就会崩溃,因为特定的命令是在内部使用的

我的“ReviceEndlessRequest”功能不再工作。由于复制是在基类型上执行的,因此所有子属性都将丢失。但是由于“ReviceRequest”期望基本类型,所以一切似乎都正常。但是应用程序支持它,因为缺少参数

在我看来,这违反了OOP规则。我需要一个BaseType,应用程序在内部使用childType


在我看来,在BuildCommand中强制转换参数也是错误的。您是怎么看的?

将基类型强制转换为子类型是完全可以接受的,只要您首先测试它是否是适当的类型,这就是示例中的switch语句所做的

如果参数不是已知的子类型,则在处理该参数的开关中应该有一个默认情况


在一个完美的世界中,您可能不需要使用此模式,因为子类的所有特殊行为都是通过在基础上定义的多态方法访问的。随着实际系统的发展,经常发生的情况是,您需要已知子类类型的某些特定行为,但不能更改基类型。

将基类型转换为子类型是完全可以接受的,只要您首先测试它是否是适当的类型,这就是示例中的switch语句所做的

如果参数不是已知的子类型,则在处理该参数的开关中应该有一个默认情况


在一个完美的世界中,您可能不需要使用此模式,因为子类的所有特殊行为都是通过在基础上定义的多态方法访问的。随着实际系统的发展,经常发生的情况是,您需要已知子类类型的某些特定行为,但无法更改基类型。

您在代码中看到的行为是由于多态性造成的。正如你所知,多态性表明一件事有多种形式。因此,在您的例子中,CopyCommand或DeleteCommand是命令的一种形式

BaseCommand确实会导致错误,因为它是命令的抽象形式。它有任何由其子类实现的抽象方法


BuildCommand方法是一种工厂方法,它根据您提供的输入构造您的命令。

您在代码中看到的行为是由于多态性造成的。正如你所知,多态性表明一件事有多种形式。因此,在您的例子中,CopyCommand或DeleteCommand是命令的一种形式

BaseCommand确实会导致错误,因为它是命令的抽象形式。它有任何由其子类实现的抽象方法

BuildCommand方法是一种工厂方法,它根据您提供的输入构造您的命令