2016-06-15 100 views
-1

我创建了一个Abstract类,现在将两个不同类的代码合并到它中。这两个代码都是相似的,但只有一行差异。如何使用相似的部分创建抽象方法,但对于具有额外代码行的类有区别?具有两种几乎相同的方法的Java抽象类

例如:

public void exampleOneMethod(int number) { 
    ***userChoice = choice - 2;*** 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

public void exampleTwoMethod(int number) { 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

public void abstractMethod(int number) { 
    while (userChoice.getNumber(number) == 0) { 
    number-- 
    } 
    option = false; 
} 

如何把userChoice =选择 - 2;只有在example1扩展抽象类时,才能进入抽象类?

+1

你不知道。相反,重新设计您的类层次结构,以便example1在不诉诸黑客的情况下获得正确的行为。您可能还想使用接口。 –

回答

2

如何尝试使用interface来代替?

public interface newInterface { 
    default void exampleTwoMethod(int number) { 
     while (userChoice.getNumber(number) == 0) { 
      number-- 
     } 
     option = false; 
    } 

    default void exampleOneMethod(int number) { 
     userChoice = choice - 2; 
     while (userChoice.getNumber(number) == 0) { 
      number-- 
     } 
     option = false; 
     } 
    } 
} 

当你想实现这个接口:

例如一个:

public class exampleOneClass implements newInterface { 
    public void exampleOneMethod(int number) { 
     newInterface.super.exampleOneMethod(number) 
    } 
} 

例如两个:

public class exampleTwoClass implements newInterface { 
    public void exampleTwoMethod(int number) { 
     newInterface.super.exampleTwoMethod(number) 
    } 
} 

这是一个有点尴尬的做正如蒂姆在评论中所说的那样,你可能需要考虑重建你的班级层次结构。

有关默认在Java中的方法的详细信息,请参阅此链接。 https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

+0

如果我被告知不要使用Interfaces进行这个程序,这将是我的最佳答案。它帮助我找到了一个我以前问的问题。只需将该方法从抽象类中移出并使用getter来获取我需要的变量即可。 –

1

您需要将它扩展为两个单独的其他类,一个与另一个,另一个没有。 extend只用于共享通用代码,如果它不是通用代码,那么它不是适合继承的实现,这是为什么composition is generally favored over inheritance

要么将​​额外的操作放到抽象方法中,并在那里执行,将类延长两次,并将该方法留空或仅由两个单独的扩展类实现exampleOneMethod。或者,重新设计,使其适合继承或重新设计,使其使用组合。

相关问题