Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:基本OOP问题_Java_Oop - Fatal编程技术网

Java:基本OOP问题

Java:基本OOP问题,java,oop,Java,Oop,我已经写了一个程序,既有高级模式也有初学者模式,允许用户在实际使用之前掌握我的程序的窍门。高级模式与初学者模式几乎相同,只是有一两种方法需要被另一种方法替换,因此我决定创建一个通用模式类,供高级模式和初学者模式类使用,而不仅仅是处理代码:如果我的解释不太清楚,下面是类结构: GUI类 通用模式类 初学者模式 高级模式 假设General Mode类具有以下代码: public class GeneralMode { private int range; private

我已经写了一个程序,既有高级模式也有初学者模式,允许用户在实际使用之前掌握我的程序的窍门。高级模式与初学者模式几乎相同,只是有一两种方法需要被另一种方法替换,因此我决定创建一个通用模式类,供高级模式和初学者模式类使用,而不仅仅是处理代码:如果我的解释不太清楚,下面是类结构:

  • GUI类
  • 通用模式类
    • 初学者模式
    • 高级模式
假设General Mode类具有以下代码:

public class GeneralMode {

    private int range;
    private String id;


    public GeneralMode() {

    }

    public int getRange() {
        return range;
    }

    public String getID() {
    return id;
    }

    public void doStuff() {

    }

}

GeneralMode类是完成程序所有工作的地方。现在,我想让高级模式类能够从GUI类获取输入,并以与GeneralMode类相同的方式使用它


谢谢你的帮助

使“GeneralMode”类成为一个抽象类,其抽象方法必须由具体的“高级”和“初学者”类实现。 两种模式的共同功能可以在“GeneralMode”类中实现

然后,在GUI类中,实例化正确的具体类,并将其放入“GeneralMode”变量中。然后,您就可以使用它,而不必知道您的程序是在初学者模式下运行还是在高级模式下运行

伪代码:

GeneralMode mode = (UseAdvancedMode == true)? new AdvancedMode() : new BeginnerMode();

使“GeneralMode”类成为一个抽象类,其中包含必须由具体的“高级”和“初学者”类实现的抽象方法。 两种模式的共同功能可以在“GeneralMode”类中实现

然后,在GUI类中,实例化正确的具体类,并将其放入“GeneralMode”变量中。然后,您就可以使用它,而不必知道您的程序是在初学者模式下运行还是在高级模式下运行

伪代码:

GeneralMode mode = (UseAdvancedMode == true)? new AdvancedMode() : new BeginnerMode();

只是为了补充Frederik的答案,GeneralMode也可以是一个带有实现此接口的初学者模式和高级模式的接口

如果您希望在所有子类之间共享逻辑,如果所有类都具有相同的getId实现和任何其他相同的方法,请使用抽象类


如果您想让实现类来实现这些方法,那么就使用一个接口。

为了补充Frederik的答案,GeneralMode也可以是一个具有实现此接口的初学者模式和高级模式的接口

如果您希望在所有子类之间共享逻辑,如果所有类都具有相同的getId实现和任何其他相同的方法,请使用抽象类


如果您想将这些方法的实现留给实现类,那么就使用接口。

GeneralMode
作为抽象类显然是正确理解polymorphic行为的方法(正如Frederik Gheysels正确解释的那样)

另一个重要的OO范例是

喜欢组合而不是继承()


如果您的项目符号列表代表您当前的继承层次结构(如果不是,请忽略我的注释…),我强烈建议您更改它,使您的
GUI类
模式组成(而不是模式的扩展--“经典”是一个“vs”有一个“问题”)。将任何GUI设置提取到一个参数对象中,然后将其传递给模式来执行它们的工作,这将进一步减少耦合。

GeneralMode
作为一个抽象类,这无疑是直接获得多形性行为的方法(正如Frederik Gheysels正确解释的那样)

另一个重要的OO范例是

喜欢组合而不是继承()


如果您的项目符号列表代表您当前的继承层次结构(如果不是,请忽略我的注释…),我强烈建议您更改它,使您的
GUI类
模式组成(而不是模式的扩展--“经典”是一个“vs”有一个“问题”)。将任何GUI设置提取到一个参数对象中,然后将其传递给模式来执行其工作,这将进一步减少耦合。

您的方法是正确的。您只需修改
doStuff()
方法,从GUI获取所需的输入参数。然后GUI可以通过它拥有的
模式
对象调用此方法,并将适当的参数传递给它。

您的方法是正确的。您只需修改
doStuff()
方法,从GUI获取所需的输入参数。然后GUI可以通过其拥有的
模式
对象调用此方法,并向其传递适当的参数。

另一种可能性是使用策略模式。在您的情况下,我更喜欢这种方式,因为我看到了更大的灵活性,例如在运行时更改模式时。在这种情况下,您不需要更改整个模型实例(Mode对象),只需要通过加载不同的策略来更改它的行为。因此,切换模式不会丢失上下文的状态

public class GeneralContext //was GeneralMode in your Code-Example
{
 ...
 public void doStuff()
 {
   myMode.doStuff()
 }

 public void changeStrategy(int mode)
 {
   switch(mode)
   {
      case EXPERT_MODE: myMode= new ExpertMode(); break;
       ....    
      default: throw NoSuchMode();
   }
 }

  ....
 private interface Mode
 {
   void doStuff();
 }

 private class ExpertMode implements Mode
 {
   void doStuff()
   {
     ....
   }
 }
 private class BeginnerMode implements Mode
 {
   void doStuff()
   {
     ....
   }
 }

}

进一步阅读:GoF Book(),第315页及其后。

另一种可能性是使用策略模式。在您的情况下,我更喜欢这种方式,因为我看到了更大的灵活性,例如在运行时更改模式时。在这种情况下,您不需要更改整个模型实例(Mode对象),只需要通过加载不同的策略来更改它的行为。因此,切换模式不会丢失上下文的状态

public class GeneralContext //was GeneralMode in your Code-Example
{
 ...
 public void doStuff()
 {
   myMode.doStuff()
 }

 public void changeStrategy(int mode)
 {
   switch(mode)
   {
      case EXPERT_MODE: myMode= new ExpertMode(); break;
       ....    
      default: throw NoSuchMode();
   }
 }

  ....
 private interface Mode
 {
   void doStuff();
 }

 private class ExpertMode implements Mode
 {
   void doStuff()
   {
     ....
   }
 }
 private class BeginnerMode implements Mode
 {
   void doStuff()
   {
     ....
   }
 }

}

进一步阅读:GoF Book(),第315页及其后。

“我想让它成为MainMode类”-我在您的程序中没有看到任何MainMode类。您能解释一下吗?您应该澄清您的GUI类是包含模式还是模式的父类。你当然应该建立一种包容的关系