5

いくつかの変数を持つSport基本クラスがあります。また、バレーボール、サッカーなど、スポーツから派生したいくつかの異なるクラスがあり、追加のメソッドと変数があります。彼らはこのように見えます。

public class Sport {
    public String commonVar;
    public Sport(String c) {
        this.commonVar = c;
    }
}

そしてバレーボール:

public class Volleyball extends Sport {
    public String onlyVolleyball;
    public Volleyball(String c, String thisVar) {
        super(c);
        this.onlyVolleyball = thisVar;
    }
}

ここで、Sportの派生クラスを別の場所の関数に渡したいのですが、パラメーターを作成します

public otherFunction(int one, int two, Sport sport) { }

スポーツをSportオブジェクトとしてのみ扱います(派生クラスを受け入れますが、Sportに共通ではない変数やメソッドにはアクセスできません)。私の質問は、データを失うことなく、すべてのタイプのスポーツ派生物を送信できる関数を作成するにはどうすればよいですか?

4

5 に答える 5

5

できませんが、オブジェクトが実際に拡張クラスのメンバーであるかどうかを確認し、次のようにキャストして使用できます。

public otherFunction(int one, int two, Sport sport)
{
    if(sport instanceof Volleyball)
    {
        Volleyball volley = (Volleyball) sport;
        //Do Volleyball things
    }
    else
    {
        //Only do sport things.
    }
}
于 2012-12-20T22:03:25.790 に答える
4

あなたはすべきではありません。その関数が抽象化Sportで機能する場合は、必要なすべての情報がSportで利用可能である必要があります。それ以外の場合は、それぞれに実際に機能(または戦略/ハンドラーなど)が必要です。

オブジェクト指向の原則で、オープンクローズド原則(SOLIDのO)を破っています。

ただし、instanceofチェックしてキャストすることで、それを行うことができます。

if (sport instanceof Volleyball) {
  Volleyball v = (Volleyball)sport;
}
于 2012-12-20T22:01:30.283 に答える
1

基本的に、問題の解決策は、本当に何を達成したいかによって異なります。

同時に、あなたの投稿を考えると、私の意見では、あなたはさまざまな責任を混ぜようとしていると思います。

  1. Sport インスタンスの処理。
  2. Sport インスタンスの派生物の処理。

おそらくこれは、メソッドが Sport インスタンスをまったく必要としないことを意味します。実際に必要なのは、特定のスポーツへのアクセスです。私が間違っている場合は修正してください。

したがって、最も簡単な解決策は、次のように otherFunction を宣言することです。

public otherFunction(int one, int two, VolleyBall sport)
public otherFunction(int one, int two, Soccer sport)
public otherFunction(int one, int two, BasketBall sport)
public otherFunction(int one, int two, AnyOtherAwsomeSport sport)

このようにして、関数が処理しているスポーツの種類を明確に伝え、さらに、理解しやすく維持しやすい非常に明確なインターフェイスを備えています。

于 2012-12-20T22:57:57.430 に答える
0

答えは、できません。メンバー、たとえば getTypeOfSport() などの抽象メソッドを基本クラスに追加する必要があります。

于 2012-12-20T22:00:54.810 に答える