0

新しいクラスを作成するために継承する抽象クラス型があります。同等の例として、次のことを考慮してください。

public abstract class BaseClass {
    public BaseClass(String input)
    {
        ...
    }
    public abstract void doSomething();
    public String getResult()
    {
        ...
    }
}

これで、BaseClass をオーバーライドして "doSomething" を実装してさまざまなアクションを実行できます (たとえば、実際に文字列を操作していた場合は、反転または大文字化しますが、実際にはそうではありませんが、これは単なる例です)。

最も一般的な使用法は次のとおりです。

BaseClass bc = new ExtendsBaseClass(input);
bc.doSomething();
String result = bc.getResult()

だから私はこれのための静的ラッパーメソッドを作りたいです。
実装したい:

public static String doSomethingForResult(String input)
{
     BaseClass bc = /*new current type*/;
     bc.doSomething();
     return bc.getResult();
}

しかし、そのコメントを何に置き換えるか、またはそれを機能させる方法がわかりません。すべての実装クラスにこれを再実装するよう強制したくありません (それが概念的に可能である場合でも、それabstract staticは許可されていないためです。

4

4 に答える 4

2

静的メソッドはポリモーフィックではないため、継承およびオーバーライドすることはできません。あなたがしたいことは不可能です。

于 2012-10-27T23:18:21.637 に答える
2

この場合、なぜ静的なものを気にするのですか?

ポリモーフィズムとマージdoSomething()getResult().

最終的には次のようになります。

public abstract class BaseClass {
    public BaseClass(String input)
    {
        ...
    }
    public abstract String doSomething();
}

クライアントは次のようになります。

BaseClass bc = new ExtendsBaseClass(input);
String result = bc.doSomething();

一般に、個別のメソッドを定義することは、ビルダーパターンgetResult()の実装などの特定のケースでは意味があります。実際、いくつかの異なるメソッドがオブジェクトの構築に参加し、最終的にある種のメソッドを呼び出します。getResult()

---------------------あなたのコメントの直後に------------------------

あなたが言ったように、一般的なケースが特定のサブクラスによってdoSomething()フォローアップを使用することであった場合、テンプレートメソッドパターンgetResult()を使用できます:

public abstract class BaseClass {
        public BaseClass(String input)
        {
          // assigments
        }

        public String process(){ //process is a template method
         doSomething();
         return getResult();
        }

        protected abstract void doSomething();

        protected abstract String getResult();
}

public class ExtendedClass extends BaseClass {

   protected void doSomething(){
     //...
   }

   protected String getResult(){
     //....
   }
}

クライアントは次のprocess()メソッドのみを呼び出します。

BaseClass bc = new ExtendsBaseClass(input);
String result = bc.process();

しかし、お願いします:)、可能な限り静的なものは避けてください。それらは良いオブジェクト指向プログラミングにつながりません。

于 2012-10-27T23:18:59.837 に答える
0

そこで、このための静的ラッパーメソッドを作成したいと思います。

なぜあなたがこれをしたいかもしれません。ボイラープレートコードを何度もコピーし続けることなく、一般的な一連の操作を実行する簡単な方法が必要です。しかし、あなたが今までに痛感しているように、静的メソッドは継承階層に場所がありません。さまざまなApacheCommonsプロジェクトとそれらのXxxUtilsクラスからインスピレーションを得ることをお勧めします。これらのクラスは、静的メソッドのみで構成され、それらが作用するクラスの階層の完全に外側に存在します。

CommonsIOのクラスFileUtilsについて考えてみます。これは単なる静的メソッドですが、非常に役立ちます。2つの方法を検討してください。

static byte[] readFileToByteArray(File file) // Reads the contents of a file into a byte array.
static String readFileToString(File file) // Reads the contents of a file into a String

1つの方法はファイルとバイト配列を扱い、もう1つの方法はファイルと文字列を扱いますか?どちらが何をするのかをどうやって知るのですか?それはそれを綴る説明的な名前を使用しているからです。FileUtilsは、ファイル、文字列、バイト配列などの継承階層の完全に外側に存在するため、継承、実装、ポリモーフィズムの問題はありません。

仮説の方法​​に戻りましょう。このメソッドをMyUtils(またはBitmapUtils)という名前の別のクラスに配置し、意味のある具象クラスのすべての組み合わせに対してメソッドを作成します。

public static String doSomethingWithExtendsBaseClass(String input)
{
     BaseClass bc = new ExtendsBaseClass();
     bc.doSomething();
     return bc.getResult();
}

public static String doSomethingWithOtherClass(String input)
{
     BaseClass bc = new OtherClass();
     bc.doSomething();
     return bc.getResult();
}

しかし、私はそのコメントを何に置き換えるのか、それをどのように機能させるのかわかりません

シンプル-対応する名前のメソッドで具象クラスを直接インスタンス化するだけです。

于 2012-10-28T00:56:42.133 に答える
-1

で静的メソッドを定義し、引数クラスとしてBaseClass使用して、他のクラスを引数として渡すことができると思います。BaseClass

public static String doSomethingForResult(String input ,BaseClass bc){
    bc.doSomething();
    return bc.getResult();
}

次に、あなたExtendedBaseClassは次のように書くことができます:

    ExtendedBaseClass extendedBaseObject= new ExtendedBaseClass();
    String result = BaseClass.doSomethingForResult("input", extendedBaseObject);
    System.out.println(result);
于 2012-10-27T23:25:44.400 に答える