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

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

public_saの回答

  • public_sa
  • ベストアンサー率52% (13/25)
回答No.4

プログラムも 実世界の構造にあわせたほうが 汎用性の高いプログラムが出来るんでは ないか?と感じてます。 っていうかそういう場合がほとんどです。 1)の StudentがstudentNumberを持つ StudentがstudentNameを持つ これはHAS-Aとして成り立つと思います。 実世界でも生徒が名前や出席番号を持っています。ね。 2)の StudentFormBean#setStudentClassの 引数型が無いのでよくわかりません super.sutudentClassも見えないのよくわかりません 生徒データを管理するのは先生?っていうのをコード化し 質問の >>2)生徒は、クラスに属する = IS-Aで考えられないか。 をもう少し紐解くと 生徒は、クラスに属する の逆を言うと クラスは生徒達を持つになりませんか? 1クラスに付き生徒1人なんて事はまずないので。。。 っていう事は、 class クラス { private 生徒達 sutudents; } ってなりますね。 生徒データを管理するものが必要だとしたら 管理するオブジェクトが生徒を持つのが 妥当かと、 そこで生徒達クラスの登場となります。 生徒達クラスが複数の生徒を管理する手段を提供すればよいと思います。 class 生徒達 { pivate 生徒[] sutudents; //例えば以下のように使いやすくなります。 private int get生徒人数 { return this.sutudents.length;} private int get男子生徒人数{ //this.sutudensを調べ返す //何で男子人数が判るかは下の[class Student extends 人]でわかります } } もっと言うとクラスを担当するのは先生なので class 先生 { private クラス clazz; } ここまでで先生がクラスを担任し、クラスには生徒達が存在し、 クラス単位で生徒達を管理するっていう形が出来上がったと思います。 じゃぁいつIS-Aが成り立つのか思いました? 例えば生徒も先生も人ですね。 以下例えばですよ。 class Student extends 人 {} class 先生 extends 人 {} class 人 extends 生き物{ private 性別; pivate 年齢; } class 生き物{ private 命; } ってすれば 先生クラスを見れば先生は人なんですから性別も年齢も 判断できることが保障されますね。 人である以上生き物なんですから 命があることもコード上保障されますね。 先生をインスタンス化する時点で保障すべき 事にはIS-Aが成り立つ、 HAS-AではOBJECT_Aが持つOBJECT_Bへの アクセス手段をオブジェクトAが実装しない限り保障されませんよね。 そのフィールドをカプセル化するのはもちろん、 アクセス手段・インスタンス化手段も限定できる それがカプセル化。 IS-Aではそのオブジェクトがインスタンス化された時点で 親オブジェクトの機能は保障されることになります。 それが継承であり、それを抽象化・Interface化することが ポリモーフィズムってことかな。 カプセル化できてなければ多能性もなくなるし、 多能性が無ければオブジェクト指向でなくて 手続き型のプログラムでよいと思うし 全てある程度できて使えるプログラムかなっておもうよ。 で DBのAccessor・DBConnectorの話になると、 DBConnectorは接続先情報を持つ。 AccessorはDBConnectorを持つ っていう風にしたほうが汎用性が高くなんじゃないかな? 今のままだと StudentDBAccessor IS DBConnectorだから DBConnectorであるStudentDBAccessorしか拡張できない。 以下みたいな考えが理解できると 汎用性の多少あるプログラムが書けるかも。 class DBAccessor extends Accessor{ private DBConnector connector; } class StudentDBAccessor extends DBAccessor{ private QueryExecuter executer; } class DBConnector extends Connector{ private DataSource ds; } DataSource - 接続先情報 QueryExecuter - SQL実行クラス と理解してください。 長文すみません わからないことあったらまた聞いてください。

kannitiha
質問者

補足

解答ありがとうございます。 遅くなりました。 この時なのですが、 DBConnectorを共用化しようとした場合どうすべきなのでしょうか? private DBConnector connector; のように定義したら、毎回初期化される气がする。。。 一度サンプルに関して、考えてみました。 それで、 QueryDBAccessorクラスは、 public class QueryExecuter implements StudentInterface { private Connection con; //指定するクラスに属する生徒をとりだす public void getStudents(){ Statement stmt = null; try{ String sql = createSqlSelectStudents(); con.prepareStatement(sql); stmt.setDataSelectStudent(); ResultSet rs = stmt.executeQuery(); //dbから取りだした結果をよびだしクラスに返す while(rs.next()){ //?ここでとりだす? } }catch(Exception e){ } } protected abstract String createSqlSelectStudents(){ //sql文 return sql文.toString(); } protected abstract void setDataSelectStudent(){ } } public interface StudentInterface{ protected abstract String createSqlSelectStudents(); protected abstract void setSelectStudent(); } な感じでしょうか? また、 DBAccessor 色んなクラスからよばれる ex) 先生を新たに追加する、etc... DBConnector dbに接続する際の処理 全体に共通するもの StudentDBAccessorは、生徒に関わる処理 っていう感じでしょうか? できたら、処理のイメージ的なものを出してもらいたいのですが。。。 よろしくお願いします。

関連する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