Java:使用多态来避免if语句?

use*_*811 15 java polymorphism inheritance if-statement interface

我正在尝试编写一个java程序,根据用户选择的内容初始化某些布局.我想要做的是尽量避免编写一堆if语句,以便在需要添加更多布局时,代码可以扩展以供将来使用.我听说实现这个的最好方法是使用多态,但我对多态的理解仍然有点模糊.

说我想实现这个案例:

if (user choose layoutA) { initialize layoutA }
if (user choose layoutB) { initialize layoutB }
if (user choose layoutC) {initialize layoutC }
Run Code Online (Sandbox Code Playgroud)

我正在考虑为要实现的类创建一个接口.令我困惑的是它在main()中是如何工作的,我是否还需要一个条件if或switch语句来确定实例化哪个类?

interface LayoutHandler {
    public void initializeLayout();
}

class layoutA implements LayoutHandler { 
    public void initialize Layout {initialize layout A}
}
class layoutB implements LayoutHandler { 
    public void initialize Layout {initialize layout B}
}
class layoutC implements LayoutHandler { 
    public void initialize Layout {initialize layout C}
}
Run Code Online (Sandbox Code Playgroud)

然后在主要的某个地方:

public static void main() {
   getlayoutselectionfromuser()
   if (user choose layoutA) { LayoutHandler layout = new layoutA(); }
   if (user choose layoutB) { LayoutHandler layout = new layoutB(); }
   if (user choose layoutC) { LayoutHandler layout = new layoutC(); }

}
Run Code Online (Sandbox Code Playgroud)

我是否仍然需要在主程序中使用switch或if语句来确定用户在运行时选择的布局?

谢谢!

Jam*_*hek 17

通常,在某些时候很难避免某种条件语句来创建适当类的实例.

当多个地方有多个if-else语句时,就会产生多态性的好处.多态性为您封装了条件逻辑.有关此主题的其他讨论,请参阅此问题.

这种分散的逻辑:

void initLayout() {
   if (user choose layoutA) { initialize layoutA }
   if (user choose layoutB) { initialize layoutB }
   if (user choose layoutC) {initialize layoutC }
}

void refreshLayout() {
   if (user choose layoutA) { refresh layoutA }
   if (user choose layoutB) { refresh layoutB }
   if (user choose layoutC) { refresh layoutC }
}

void cleanupLayout() {
   if (user choose layoutA) { cleanup layoutA }
   if (user choose layoutB) { cleanup layoutB }
   if (user choose layoutC) { cleanup layoutC }
}
Run Code Online (Sandbox Code Playgroud)

获取替换为更简单的东西:

   layout = getLayout(user choice);

   layout.initLayout();
   layout.refreshLayout();
   layout.cleanupLayout();
Run Code Online (Sandbox Code Playgroud)