2012-04-25 11 views
0

ライブラリ管理システムを構築する必要があり、ユーザータイプやプロファイルを実装する際に問題が発生しました。私は既にスーパークラスのユーザーと、User、Student、Teacherという2つのサブクラスを持っています。それぞれ、独自の「特性」を持っています。私は、借りることができる書籍の数と、書籍を返却するまでの間、書籍を保管できる時間に基づいて、7種類のユーザー(5種類の学生と2種類の書類)を実装する必要があります。それらはクラス間の唯一の2つの違いです。ライブラリ管理システムのユーザータイプ

これはどのように実装しますか?継承?私はこれを実装するための巧妙な方法を探しています。私はあなたの考えを聞きたいと思います。

ありがとうございました。

答えて

2

大まかに言えば、プロジェクトの仕様で名詞が見られる場所はどこでも良い候補です。これらの名詞がプロジェクト仕様で関係を持っている場合、おそらくあなたのコードにもこれらの名詞があるはずです。

あなたの人はすべてUserというカテゴリに属しているので、おそらくこれはすべてが継承するインターフェイスである必要があります。これからは、StudentStaffという2つのカテゴリに適合しているように見えますが、これらはおそらく抽象クラス/インタフェースでもあるはずです。その後、あなたは7つの具体的なクラスを持っています。 2はStaffを継承し、5はStudentを継承しています。

ですから、このようなものに終わるだろう...もちろん enter image description here

を、このデザインは、すべてのUserは何をしなければならないかに依存してどのようなすべてのStaff/Studentを行う必要がありますが、私は非常に具体的に残しておきますあなたに詳細。

+0

これは私の最初の選択でしたが、本当に似たような7つのクラスを持っていることについては奇妙な感じがします。 – DaveQuinn

+0

@PMMPまあ、どれくらい似ていますか?この設計は、互いに依存しないようにする。あまりにも緊密に結合されていると彼らはあなたのシステムを再設計する必要があります変更します。 – Aidanc

+0

たとえば、Studentクラスをとります。 2つのサブクラスは、学部とマスターです。このシステムの目的のために、彼らの唯一の違いは、借りることができる本の数です。 – DaveQuinn

1

1人につき「クラス」があり、実際にはデザインが制限されています。学生や教師を追加する場合は、新しいクラスを作成する必要があるためです。

クラスはテンプレートであり、各テンプレートは「クラスのインスタンス」、具体的には「インスタンス」を構築するために使用されます。通常、1つのテンプレートは複数のクラスを構築するために使用されます(ただし、は必要ありません)。一度使用する(またはまったく使用しない)場合は、クラスを複数回使用する必要はありません。

だから、あなたが見ることができるよう、スタッフと学生間の重複の多くがあるように起こっている

public class Student { 

    private String name; 

    public Student(String name) { 
    this.name = name; 
    } 

    public string getName() { 
    return this.name; 
    } 

} 

public class Staff { 

    private String name; 

    public Staff(String name) { 
    this.name = name; 
    } 

    public String getName() { 
    return this.name; 
    } 

} 

行うことができます。 getName()getAge()getPhoneNumber()getAddress()などを簡単に適用することができます。この構造では、StudentStaffの両方のメソッドを複製する必要があります。

スタッフと学生の共通点は何ですか?それらはいずれもPeopleであり、一般的な方法の多くはすべての人に共通しています。

public class Person { 

    private String name; 

    public Person(String name) { 
    this.name = name; 
    } 

    public String getName() { 
    return this.name; 
    } 
} 

public Staff extends Person { 

    public void teachClass(Class class) { 
    ... 
    } 

} 

public Student extends Person { 

    public void attendClass(Class class) { 
    ... 
    } 

} 

それはスタッフが学生でないことを暗示するように、この設計はまた、他の問題を作成し、学生はスタッフメンバーではありません。現実世界では、スタッフが授業に参加することがあり、生徒は教師の役割を担うことができます(教師の補佐官と考える)。

実際、最も柔軟性の高い方法は、学生とスタッフの間の構造的差異を作成しないため、2つの能力によって区別します。

public class Person { 

    public Person(String name) { 
    ... 
    } 

    public void canTeach(Course course) { 
    teaching.add(course); 
    } 

    public void attending(Course course) { 
    attending.add(course); 
    } 

    public boolean isStaff() { 
    return !teaching.isEmpty(); 
    } 

    public boolean isStudent() { 
    return !attending.isEmpty(); 
    } 

} 

しかし、この構造は、クラスで提示されている、そしてそれはあなたが本当に相続について学ぶことになっているレッスンをサイド手順例とは根本的に異なります。

関連する問題