【问题标题】:How to write an abstract main class如何编写一个抽象的主类
【发布时间】:2013-08-16 21:49:44
【问题描述】:

我需要写一些进口商。他们需要所有相同的初始化。所以我尝试写一个抽象类,它做了所有的初始化,也有main方法,这样所有的子类只需要实现run()就可以完成它们具体的导入工作:

public abstract class AbstractImporter {

    public AbstractImporter() {
        // Initialization
    }

    public abstract void run();

    public static void main(String[] args) {
        AbstractImporter importer = new AbstractImporter();
        importer.run();
    }

}

public class ConcreteClass() {

  public void run() {
    // Do some importing  
  } 

}

当然无法创建这个抽象类的实例 (new AbstractImporter())。

有人知道如何解决这个问题吗?蒂亚!

【问题讨论】:

  • 你想让main方法做什么?
  • @JBNizet 我喜欢避开具体子类中的main方法,所以这个抽象超类的main方法应该实例化子类并调用run方法。
  • 你将如何在父类主方法中实例化子类??你确定你要做什么??
  • @tech-idiot 不,你是对的。可能为时已晚... ;)

标签: java main abstract


【解决方案1】:

显然你需要一个具体的类——匿名或其他。

最好将 main 方法移动到另一个类并根据数据(您的域特定或常量)实例化适当的具体类,然后运行它。这样每个实现都可以独立于其他实现。

public abstract class AbstractImporter {

    public AbstractImporter() {
        // Initialization
    }

    public abstract void run();
}

public class ConcreteImporter1 extends AbstractImporter {
    public void run() {
        //do something
    }
}


public class ImporterMain() {

    public static void main(String[] args) {
        AbstractImporter importer = createImporter(args[1]);
        importer.run();
    }

    private static AbstractImporter createImporter(String type) {
        if (type.equals("1")) {
            return new ConcreteImporter1();
        }
        ....
    }
}

【讨论】:

    【解决方案2】:
    new AbstracterImporter() { 
      public void run() { 
        // ... 
      } 
    };
    

    对于目前在移动设备上缺少格式,我深表歉意。

    【讨论】:

    • 对不起,我没注意到,不是想在之后编辑,但我打错了,是想在void 之前添加run
    • 感谢您的回答。当我使用有效的run() 方法创建它的子类并调用其超类的主方法时,调用匿名类的run() 方法而不是我的子类类
    • @t777:你的子类当然没有运行!您必须创建子类的对象,而不是匿名类的对象。
    • @HovercraftFullOfEels 所以子类需要自己的run方法。但我喜欢避免这种情况(如果可能的话)。
    • @t777: re "So the subclass needs its own run method." -- 这没有任何意义。如果您希望您的实例成为子类的实例,则必须使其成为该子类的实例,方法是在该子类上调用 new 或使用某些工厂方法。
    【解决方案3】:
    public abstract class AbstractImporter {
    
        public AbstractImporter() {
            // Initialization
        }
    
        public abstract void run();
    
        public static void main(String[] args) {
            AbstractImporter importer = new AbstractImporter(){
                public void run() {
                    System.out.println("Anonymous implementation");
                }
            };
            importer.run();
        }
    }
    

    【讨论】:

      【解决方案4】:

      您不能创建抽象类的实例。

      public abstract class AbstractImporter {
      
      public AbstractImporter() {
          // Initialization
      }
      
      public abstract void run();
      
      }
      
      public class ConcreteClass extends AbstractImporter{
      
          public void run(){
                  //Implementation
      
          }         
      
          public static void main(String args[]){
      
                  AbstractImporter ai = new ConcreteClass();
                  ai.run();
      
           }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        • 2017-02-01
        • 1970-01-01
        • 2016-02-28
        • 1970-01-01
        • 2019-12-05
        相关资源
        最近更新 更多