質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.04%

  • Java

    12092questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

javaクラスの初歩的な質問

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 257

uer03108

score 80

下記の様な簡単な抽象クラスを作りました。
文字列に接頭語、接尾語を追加するクラスになります。

この例では、抽象関数doExecの戻り値は文字列型ですが、違う変数型でも返したい場合はどの様にすればよいでしょうか。
質問は、「抽象関数(doExec)の戻り値の型が定まっていない場合はどうすれば良いか」になります。

クラスの例が悪い場合は、申し訳ございません。

具体的なことを言うと、
複数の関数で行う複数の共通処理を抽象クラスで表現出来るのかなということになります。

普通にprivate関数を使っても良いのですが、こちらの方が見やすそうなので。


Sample.java

package sample;

public class Sample {


    /////////////////////////////////////////////////////////
    //
    //  抽象クラス
    //
    /////////////////////////////////////////////////////////
    abstract class Action {

        //全処理
        public String exec(String pre, String post) {
            String s;
            s = funcPre(pre);
            s = doExec(s);  //個別処理
            return funcPost(post, s);
        }

        //共通処理 
        protected String funcPre(String pre){
            return pre + "_";
        }

        //共通処理 
        protected String funcPost(String post, String s){
            return s + "_" + post;
        }

        //個別処理
        abstract public String doExec(String s);  //共通引数
    }


    /////////////////////////////////////////////////////////
    //
    //  クラスA
    //
    /////////////////////////////////////////////////////////
    class ActionA extends Action {

        //個別変数
        private String text;

        //個別処理
        public String doExec(String s) {
            return s + text + "_ActionA_";
        };

        //クラスオブジェクト
        public ActionA setArgs(String text) {
             this.text = text;
             return this;
        }
    }

    public String funcA(String pre, String post, String text){
        return new ActionA().setArgs(text).exec(pre, post);
    }


    /////////////////////////////////////////////////////////
    //
    //  クラスB
    //
    /////////////////////////////////////////////////////////
    class ActionB extends Action {

        //個別変数
        private String text;

        //個別処理
        public String doExec(String s) {
            return s + text + "_ActionB_";
        };

        //クラスオブジェクト
        public ActionB setArgs(String text) {
             this.text = text;
             return this;
        }
    }

    public String funcB(String pre, String post, String text){
        return new ActionB().setArgs(text).exec(pre, post);
    }

}

Main.java

package main;

import sample.*;

public class Main {

    public static void main(String[] args) {

        Sample sample = new Sample();

        String pre = "接頭語";
        String post = "接尾語";
        String text = "ああああ";

        String s1 = sample.funcA(pre, post, text);
        String s2 = sample.funcB(pre, post, text);

        System.out.println(s1);
        System.out.println(s2);

    }

}

実行結果

接頭語_ああああ_ActionA__接尾語
接頭語_ああああ_ActionB__接尾語
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2017/09/25 15:10 編集

    doExec(String)の戻り値の型が決まってなかったらその後に続く共通処理の引数の型も決まらないので、「共通」処理にそもそもなってないと思うんですが

    キャンセル

  • uer03108

    2017/09/25 15:11

    例えが悪くて申し訳ございません。後処理は無しでお願いします。

    キャンセル

  • fuzzball

    2017/09/25 15:28

    最初の ``` を ```java にして下さい。ハイライトがおかしいです。

    キャンセル

回答 2

checkベストアンサー

+1

こういうこと?

public class Main {
    public static void main(String[] args) throws Exception {
        Sample<Integer> s1 = new SampleA();
        Integer y1 = s1.addOne(1); // 2
        System.out.println(y1);

        Sample<String> s2 = new SampleB();
        String y2 = s2.addOne(1); // "2!!"
        System.out.println(y2);

    }
}


abstract class Sample<T>{
    public T addOne(int x){
        int y = preFunc(x);
        return func(y);
    }

    private int preFunc(int x){
        return x+1;
    }

    abstract protected T func(int x);
}

class SampleA extends Sample<Integer>{
    public Integer func(int x){
        return (Integer)x;
    }
}

class SampleB extends Sample<String>{
    public String func(int x){
        return String.valueOf(x)+"!!";
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/25 15:51

    こういうことです。
    有難うございましたm(_ _)m
    大変、勉強になります。

    キャンセル

0

java ジェネリクスで検索してもらえれば沢山出てきますが、
サンプルでやるとこんな感じでしょうか。
(実装の内容はozwkさんと大差ないです)

public class Sample {

    //  抽象クラス
    abstract class Action<T> {
        //個別処理
        abstract public T doExec(T s);  //共通引数
    }

    //  クラスA
    class ActionA extends Action<String> {
        //個別処理
        public String doExec(String s) {
            return s + text + "_ActionA_";
        };
    }

    //  クラスB
    class ActionB extends Action<Integer> {
        //個別処理
        public Integer doExec(Integer s) {
            return s * 1.08;
        };
    }

}

<T>がジェネリクスと言います。
ListやMapで利用した経験はあるかと、、、

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/25 15:52

    >ListやMapで利用した経験はあるかと、、、

    確かに、使用していました。
    お恥ずかしい限りです。

    有難うございましたm(_ _)m

    キャンセル

  • 2017/09/25 19:49 編集

    最後Integer型のメソッドなのに返り値がdouble型になってません?

    キャンセル

  • 2017/09/25 22:34

    確かに

    キャンセル

  • 2017/09/26 09:12

    あ、、、

    お恥ずかしい限りで。。
    未実行です、すいません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    12092questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。