向下铸造 polimorphic 对象

down casting polimorphic objects

提问人:nikhrom 提问时间:12/15/2021 更新时间:12/15/2021 访问量:71

问:

有一个数据块,包含不同类型结构的连续打包数据。有必要将此数据读入数组中。 它的编程方式如下:

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...

收到列表后,我们使用 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 转换

评论

1赞 QBrute 12/15/2021
如果需要为每个子类使用不同的行为,请在 中定义一个方法(例如泛型或大约),然后在每个子类中重写该方法。然后,您需要做的就是或类似的事情,具体取决于您需要返回的内容abstractMyStructexecuteActionstructs.forEach(MyStruct::executeAction);
1赞 juwil 12/15/2021
如果您使用的是最新的 jdk 17,则可以切换而不是 if-else。但@Qbrute的方法更好。
0赞 nikhrom 12/16/2021
@QBrute,非常感谢您的回答。如果所有结构都具有应应用于每个结构的通用行为(例如,形状的 draw() 方法),则此解决方案适用。但是,例如,想象一下,你有一个形状数组,在整个巨大的形状数组中,你只需要显示圆形的半径和正方形的对角线,仅此而已。我的情况也差不多。
3赞 Holger 12/16/2021
搜索“访客模式”
2赞 Holger 1/10/2022
@S.Sachith A Visitor是一种策略,所以与它并不矛盾。但是 Visitor 模式是告诉你如何为子类提供不同的实现的模式。

答: 暂无答案