• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:「オブジェクト志向」の考えかたで質問します。)

「オブジェクト志向」の考えかたで質問します

hoge_piyoの回答

  • hoge_piyo
  • ベストアンサー率57% (15/26)
回答No.6

最初の質問と少しずれてきてしまいましたが・・・とりあえずStrategyパターンについて解説しておきます。 sampleだからしかたないですが、リンク先のページは単純にしすぎて逆にわかりづらいですね・・・MyClassが単純すぎてほとんど意味がありません。 以下にもう少し実際に近いsampleを載せます。Strategyのポイントは"アルゴリズムを入れ替える"ということです。 TreeSetのComparatorに違うものを使用することによって、体重別と身長別という異なる順でソートしています。この場合、最初からTreeSetはStrategyパターンで設計されています(途中でComparatorを入れ替えられないので、厳密にはStrategyパターンとは言えないかもしれませんが) このように、そもそもJavaのコレクション自体の多くのところでデザインパターンが使用されているので、ソースコードを読んでみるといいでしょう。 public class CompareTest { public static void main(String[] args) { Set<Human> people = new HashSet<Human>(); people.add(new Human("一郎",170,60)); people.add(new Human("二郎",165,55)); people.add(new Human("三郎",175,58)); people.add(new Human("四郎",160,67)); people.add(new Human("五郎",180,62)); SortedSet<Human> heightSortSet = new TreeSet<Human>(new HeightComparator()); SortedSet<Human> weightSortSet = new TreeSet<Human>(new WeightComparator()); heightSortSet.addAll(people); weightSortSet.addAll(people); System.out.println("身長順"); for(Human h:heightSortSet){ System.out.println(h); } System.out.println("\n体重順"); for(Human h:weightSortSet){ System.out.println(h); } } } class Human{ Human(String name,int height,int weight){ this.name = name; this.height = height; this.weight = weight; } public final String name; public final int height; public final int weight; @Override public String toString(){ return "名前:"+name+" 身長:"+height+" 体重:"+weight; } } //身長で比較するComparator class HeightComparator implements Comparator<Human>{ @Override public int compare(Human h1,Human h2) { return h1.height - h2.height; } } //体重で比較するComparator class WeightComparator implements Comparator<Human>{ @Override public int compare(Human h1,Human h2) { return h1.weight - h2.weight; } }

kannitiha
質問者

補足

解答ありがとうございます 調べてみました。 コレクションというのは、List,ArrayList, Set,HashSet etc...の亊を言うのでしょうか? また、 List<Human> heightList = new ArrayList<Human>(new HeightComparator()); の系式で表す亊はできるのでしょうか? このときのアルゴリズムをいれかえる動作というのは、 ソースでいうと、 SortedSet<Human> heightSortSet = new TreeSet<Human>(new HeightComparator()); SortedSet<Human> weightSortSet = new TreeSet<Human>(new WeightComparator()); の部分の亊をいうのでしょうか? 一方、これをListでも実現する亊はできるのでしょうか? その場合、Collectionを実装する必要があるように感じるのですが。。。 以下、一度考えてみました。 //HeightComparatorを変えたソース public class HeightComparator2 extends HeightCollection implements Comparator<Human2> { public int compare(Human2 h1,Human2 h2) { System.out.println("test--- during //// "); System.out.println("h1.height +"+h1.height + "/h2.height:" + h2.height); return h1.height - h2.height; } } //Collectionを実装したクラス public class HeightCollection implements Collection { } public class SampleRun{ public static void main(String[] args){ //Listに入れる型を指定しておく List<Human2> list = new ArrayList<Human2>(); list.add( new Human2("right", 120,24) ); //万一、Listにクラスインスタンスを入れようとしたら、Collectionでしか対応しない // List<Human2> heightList = new ArrayList <Human2>( (Collection) new HeightComparator2()); List<Human2> heightH = new ArrayList<Human2>(); heightH.addAll(list); heightH = new ArrayList<Human2>(); heightH.addAll(list); heightH = new ArrayList<Human2>(new HeightComparator2()); for(Human2 ha: heightH) { System.out.println("ha::: " + ha); } } } 補足: また、Collectionを仮に、実装するクラスを作ってみたのですが、 一般に、このような形で使われる亊はあったりするのでしょうか? よろしくお願いします。

関連するQ&A

  • Javaのプログラムについて至急教えてください!

    //Sub.java class Super{ public void A(){} } class Sub extends Super{ /* (1) */ } このプログラムの(1)に入るものを下から2つ選んで他のクラスのメインメソッドから呼び出すのですがどうやってもわかりません。わかる方教えてください! public void A(){} public String A(){ return "pool";} public int A(String str){return Integer.parseInt(st);} public int A(){return 3;} public Object A(){return new Object();}

    • ベストアンサー
    • Java
  • 抽象クラスとオブジェクトを格納する配列(java)

    独習java第4版でわからない所があります。 abstract class Widget { String color; abstract int getMass(); public String toString() { return getClass().getName() + ": " + color + ", " + getMass(); } } class WidgetA extends Widget { final static int MASS = 4; WidgetA(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetB extends Widget { final static int MASS = 1; WidgetB(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetC extends Widget { final static int MASS = 5; WidgetC(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetD extends Widget { final static int MASS = 17; WidgetD(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetTypes { static int NUMWIDGETS = 6; public static void main(String args[]) { // 部品を格納する領域を宣言して割り当てる Widget widgets[] = new Widget[NUMWIDGETS]; // 部品を作成する widgets[0] = new WidgetC("Red"); widgets[1] = new WidgetA("Green"); widgets[2] = new WidgetD("Yellow"); widgets[3] = new WidgetB("Magenta"); widgets[4] = new WidgetA("Black"); widgets[5] = new WidgetC("White"); // 部品を処理する int totalMass = 0; for(int i = 0; i < NUMWIDGETS; i++) { Widget w = widgets[i]; System.out.println(w); totalMass += w.getMass(); } // 総重量を表示する System.out.println("Total mass = " + totalMass); } } これはある問題の解答ですが、僕にはどうしても理解出来ない部分があります。 mainのforループ内で Widget w = widgets[i]; totalMass += w.getMass(); となっています。 この仕組がわかりません。 まず Widget w = widgets[i] でWidget型の変数wにWidget型のwidget[i]を代入しているのにw.getMass()がエラーにならない理由がわかりません。(Widgetクラスは抽象クラスなのにwがWidgetクラスのインスタンスになっている?) これは 抽象メソッド( abstract int getMass() ) があるためでしょうか? ちなみにWidgetクラスとそのサブクラスからこの抽象メソッドを削除したらコンパイルエラーが出ました。 ではなぜ抽象クラスの抽象メソッドから、そのサブクラスのメソッドまで範囲が伸びるのでしょうか? どういう仕組でしょうか? この質問を書きながら思ったのですが、どうも配列の仕組みや抽象クラス・メソッドの仕組み、「オブジェクト」と「インスタンス」の違いがよくわかってないようです。 多分問題の本質はそこにあると思うんです。 駄文で申し訳ないです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • インタフェイス実装と抽象クラス継承を同時に使うには??

    私はjava初心者です、今練習問題で困っています。 1つのクラスに抽象クラスとインターフェイスを 実装することはできるのでしょうか? 例えば abstract class Car { private String gas; public void getGas(int gas) { this.gas = gas; } public abstract void enjin(); } interface Flying extends Pet { void show(); } 上のインタフェイスと抽象クラスを同時に下のクラスに継承、実装しよう とすると、どんな風にかけば良いのでしょうか class Zoon { public Zoon() { super(); } public void enjin() { System.out.println("どどどどど"); } public void show() { System.out.println("いいくるまだ"); } }

    • ベストアンサー
    • Java
  • 継承について質問させていただきます

    Java初心者です。 privateなフィールドは継承されない と書籍にありましたが、理解に苦しんでおります。 具体例で申しますと、下記コードの cat.setCount(3); です。 CatクラスにはAnimalクラスの変数countは継承されないと考え、 エラーとなることを想像していたのですが。。。 なぜエラーとならないのでしょうか? 宜しければ、解りやすくご説明していただければ幸いです。 どうかよろしくお願いいたします。 ---------------------------------------------- class Animal{ private int count; int getCount(){ return count; } void setCount(int c){ this.count = c; } } class Cat extends Animal{ } public class test{ public static void main(String[] args){ Cat cat = new Cat(); cat.setCount(3); // ここが理解できません System.out.println(cat.getCount()); // ここも同様 } } ----------------------------------------------

    • ベストアンサー
    • Java
  • javaの配列とクラス

    abstract class abstract_class{ } class subclassA extends abstract_class{ int num = 1; } class subclassB extends abstract_class{ int num = 2; } class subclassC extends abstract_class{ int num = 3; } class Main{ public static void main(String args[]){ int sum = 0; abstract_class var[] = new abstract_class[3]; var[0] = new subclassA(); var[1] = new subclassB(); var[2] = new subclassC(); for(int i=0;i<3;i++) sum += var[i].num; System.out.println(sum); } } これをコンパイルすると Main.java:23: シンボルを見つけられません。 シンボル: 変数 num 場所 : abstract_class の クラス for(int i=0;i<3;i++) sum += var[i].num; ^ エラー 1 個 というエラーが出るのはなぜでしょうか? var[i]はみなsubclassA,subclassB,subclassCが代入されているのに、numはabstract_classの変数となっています。 よくわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 敬称について教えてください

    class parent{ protected final static int val=10; } class Child extends Parent{ private int val=100; public void method(String s){ System.out.println(++val)} } } class Test{ int val=10; public static void main(String args[]){ Parent c=new Child(); c.method("HELLO"); } } 初歩的な質問ですみません。教えて下さい。 上記プログラミングで、下から3行目のc.method・・・ を記入してもコンパイルエラーがおこらないのはなぜでしょうか? 今回newしているのはChildのオブジェクトです。 が、型はParentです。 Parentにはmethodはないし、 なぜこれが許されるのかがわかりません。 分かりやすくおしえてもらえませんか?

    • ベストアンサー
    • Java
  • インナークラスを含むオブジェクトのXMLEncoding

    インナークラスを含むオブジェクトをXMLエンコーダで直列化しようとすると、 デフォルトコンストラクタが無いといった内容の例外が発生して失敗します。 そのインナークラスをトップレベルにリファクタリングすると、それは全く問題なく 動作することを確認しています。 インナークラスを含めたままXMLエンコーダで直列化するには、特別な方法が 必要なのでしょうか?仕様上不可能? これらに関する情報が全く見つからなくて困っています。 ご存知の方がおられましたら、よろしくお願いします。 import java.beans.XMLEncoder; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class EncodingSample { public class InnerClass { public int getIntValue() { return intValue; } public void setIntValue(int intValue) { this.intValue = intValue; } public String getStringValue() { return stringValue; } public void setStringValue(String stringValue) { this.stringValue = stringValue; } public InnerClass() { } public InnerClass( int intValue, String stringValue ) { setIntValue( intValue ); setStringValue( stringValue ); } private int intValue; private String stringValue; } public void setData( int intValue, String stringValue ) { innerClass = new InnerClass( intValue, stringValue ); } public void encode( String file ) throws FileNotFoundException { XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(file))); encoder.writeObject(this); encoder.close(); } public InnerClass getInnerClass() { return innerClass; } public void setInnerClass(InnerClass innerClass) { this.innerClass = innerClass; } public static void main(String[] args) { EncodingSample sample = new EncodingSample(); sample.setData( 12, "TextString" ); try { sample.encode("SampleFile.xml"); } catch (FileNotFoundException e) { e.printStackTrace(); } } public EncodingSample() { } private InnerClass innerClass; }

  • コンパイルエラー(Threadオブジェクト化)

    Runnableを継承したNormalClassをThreadとしてオブジェクト化しようとしているのですが、コンパイルエラーが出現して困っています。どうすればいいでしょうか? 下記エラー参照 Main.java:1: NormalClass は abstract でなく、java.lang.Runnable 内の abstract メソッド run() をオーバーライドしません。 下記ソース class NormalClass implements Runnable{ } class Main extends Thread{ public static void main(String args[]){ test = new Thread(new NormalClass()); } }

    • ベストアンサー
    • Java
  • 整数値を任意のオブジェクトを格納できるスタッククラスに格納する方法

    class ObjStack { private Object[] mBuf; private int mSP; public ObjStack(int size) { mSP = 0; mBuf = new Object[size]; } public int getSize() { return mBuf.length; } public int getNum() { return mSP; } public boolean isFull() { return mSP == mBuf.length; } public boolean isEmpty() { return mSP == 0; } public void push(Object x) { if (!isFull()) { mBuf[mSP++] = x; } } public Object top() { Object obj = null; if (!isEmpty()) { obj = mBuf[mSP-1]; } return obj; } public Object pop() { Object obj = null; if (!isEmpty()) { obj = mBuf[--mSP]; } return obj; } } 上のプログラムは任意のオブジェクトを格納できるスタッククラスです。 int型の値はオブジェクトではないので、このObjyStackクラスに格納することができない。 整数値をこのObjStackクラスに格納する方法を教えて下さい。

    • ベストアンサー
    • Java
  • Javaについて教えてください!

    public class Number{ private final String noo; private int ct; public Number(String noo){this.noo = noo;} public String getName(){return noo;} public void increment(){ct++;} public int getCount(){return ct;} public void reset(){ct = 0;} } このクラスを複数スレッドで使うためには、reset()とgetName()とgetCount()をsyncronizedで宣言すれば可能ですか?

    • ベストアンサー
    • Java