繁体   English   中英

OOP 将子转换为父并返回

[英]OOP convert child to parent and back

我有一个关于 OOP 的一般性问题我在程序中找到了以下代码(作为示例显示)。 这里需要一个父 class 作为参数,但是传递了一个子,然后从父类型转换回子类型 我是认为这种来回转换是否违反 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# 只给 object 一个 refrenze。 因此,您可以将它们从父 co 孩子转换回来。

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

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

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

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

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

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

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

您在代码中看到的行为是由于多态性造成的。 如您所知,多态性表明一件事有许多 forms。 因此,在您的情况下, CopyCommand 或 DeleteCommand 是命令的 forms 之一。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM