3

ジェネリックな抽象クラス(SuperClass)があります。各サブクラスのデフォルトのメインであり、同じことを行うメソッドが必要mainですが、それを派生させて呼び出した適切なサブクラスオブジェクトを使用します。

このような:

 public abstract class SuperClass {

    // some code here...

    public static void main(String args[]) {
       // here instantiate the subclass
       // extending this SuperClass, and call
       // some methods
    }
 }

 public SubClass extends SuperClass {
      // here just implement some 
      // abstract methods from SupeClass
      // and NOT implement main()
 }

SubClassそして今、私はスタンドアロンプ​​ログラムとして実行できるようにしたいと思います。それはmainから派生したデフォルトを実行しますSuperClassSubClassメソッドで適切なオブジェクトをインスタンス化するmain方法は?

  • SuperClassの実際の名前がわからないので、私はただ新しいことをすることはできませんSubClass
  • スーパークラス内からサブクラスの名前を取得するSubClassで実装された静的メソッドからの名前を取得できないため、リフレクションを使用してそれを行うことはできませんSuperClass

C ++、AFAIRにはvirtual、メソッドの修飾子のようなものがあります。これは、ここで役立つと思います。Javaで行う方法は?

4

4 に答える 4

7

静的メソッドは継承されません。サブクラスをアプリケーションのエントリポイントにする場合は、サブクラスのメインメソッドをプログラムします。

于 2012-07-03T14:39:27.430 に答える
1

たとえば、SpringIOCを使用できます。

次のようなxmlファイルを作成し、クラスパスに入れます。

appconfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <bean id="someBean" class="com.company.SubClass"/>

</beans>

次に、メインコードで次のようなことを行うことができます。

   public static void main(String args[]) {
       ApplicationContext context = ClassPathXmlApplicationContext("appconfig.xml");
       SuperClass startClass = (SuperClass) context.getBean("someBean");
       startClass.someMethod();
   }

そうすると、SuperClassはそのサブクラスについて認識しなくなります(ただし、代わりにSpringについては認識します...)。

クラスパスにもいくつかのSpringjarファイルを追加する必要があります。

于 2012-07-03T14:51:18.563 に答える
0

サブクラスで静的メソッドを継承することはできませんが、C ++で仮想のようなメソッドを作成する場合は、メソッドを抽象化または保護します

于 2012-07-03T14:52:40.950 に答える
0

SubClassをスタンドアロンプ​​ログラムとして実行できるようにしたい場合は、のようなものを実行できるようにしたいということですjava my.app.SubClass。これは、誰もがすでに指摘しているように、静的メソッドは継承されないため、機能しません。

この奇妙なサブクラスのネストが必要な理由に応じて、次のような非静的メインを実装することで回避策を見つけることができます。

public class SuperClass{ 
  public static void main(String[] args) {
     SuperClass c = //figure out which class to load via a factor or something
     c.nonStaticMain(args);
  }
  protected void nonStaticMain(String[] args) {
    //do everything from your old main() here
  }
} 
于 2012-07-03T15:05:01.970 に答える