向下投射多态对象

问题描述 投票:0回答:1

有一个数据块,包含不同类型结构的连续打包数据。需要将此数据读入数组。 它的编程是这样的:

class Handler{
    //...
    public List<MyStruct> getMyStructs(){
        // when processing, some subsequent data depends on the 
        // processing of the previous ones
    }

    //...
}

abstract class MyStruct{ 
    // Common method implementations for all structs 
}

class ImpulsOne extends MyStruct{
    // declaring and init fields 
    // methods
}

class ImpulsTwo extends MyStruct{
    // declaring and init fields
    // methods
}

//and etc...

收到List后,我们可以使用MyStruct中的常用方法来生活和享受生活。但是只要没有任务从某些类型的多个结构中提取并显示或处理多个字段,就会发生这种情况。可以有很多这样的处理,不幸的是,每个处理都取决于先前处理的结果。

我唯一想到的就是对每个处理进行向下转换:

//...
    SomeResult processing1(List<MyStruct> structs){
        //...
        for(var struct: structs){
           if(struct instanceof ImpulsOne){
                ImpulsOne impuls = (ImpulsOne) struct
                // extracting fields and processing
           }else if(struct instanceof ImpulsTwo){
                ImpulsTwo = (ImpulsTwo) struct
                // extracting fields and processing
           }

           // and many many else-if
        }
    }
//...

我不喜欢这种方法,我相信它可以变得更容易。

我希望我已经清楚地解释了问题的全部本质。您遇到过类似的问题吗?你有什么想法来简化代码?

谢谢。

java oop casting
1个回答
0
投票

我认为你可以从结构转向物体。我的意思是你可以将处理逻辑放入对象中,而不是从对象中提取字段并对其进行处理。

目前您提供以下服务:

SomeResult processing1(List<MyStruct> structs) {
   for(var struct: structs){
      if(struct instanceof ImpulsOne){
         ImpulsOne impuls = (ImpulsOne) struct
         // extracting fields and processing
      } else if(struct instanceof ImpulsTwo){
         ImpulsTwo = (ImpulsTwo) struct
         // extracting fields and processing
      }
      // and many many else-if
      }
}

我建议如下:

SomeResult processing1(List<MyStruct> structs) {
   for(var struct: structs){
      struct.process();
   }
}

并为

process()
ImpulsOne
等定义具体的
ImpulsTwo
方法

© www.soinside.com 2019 - 2024. All rights reserved.