Eラーニングプラットフォーム
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 84/87。
最終チャレンジの章へようこそ!これらのチャレンジは、このコース全体を通して学んだすべてのOOP概念の習熟度をテストするように設計されています。
このチャレンジでは、継承、インターフェース、ポリモーフィズム、カプセル化、およびデザインパターンをまとまりのあるアプリケーションに組み合わせたEラーニングプラットフォームシステムを構築します。
あなたのプラットフォームは、コース、学生、および講師の間の関係をモデル化する必要があります。UserベースクラスがどのようにStudentクラスやInstructorクラスによって拡張されるか、コースがどのようにレッスンを含むか、そして学生とコースの間で受講登録の追跡がどのように機能するかについて考えてみてください。
どのOOP原則が適用されるか検討してください:ユーザーデータを保護するためにカプセル化を使用し、共通の動作を共有するために継承を使用し、EnrollableやCompletableのようなコントラクトを定義するためにインターフェースを使用し、異なるユーザータイプを一律に処理するためにポリモーフィズムを使用します。
学んだことをすべて活用して、頑張ってください!
チャレンジ
簡単このコースで習得したすべてのOOPコンセプトを統合したEラーニングプラットフォームを構築しましょう!継承、インターフェース、ポリモーフィズム、およびカプセル化を使用して、コース、学生、および講師の間の関係をモデル化するシステムを作成します。
コードは6つのファイルに分けて構成します:
Enrollable.java: 登録操作のコントラクトを定義するインターフェースを作成します。booleanを返すenroll(Student student)メソッドと、intを返すgetEnrolledCount()メソッドを宣言する必要があります。User.java: プラットフォーム上の任意のユーザーを表す抽象基底クラスを作成します。id(String) とname(String) のプライベートフィールド、両方を初期化するコンストラクタ、適切なゲッター、およびユーザーの役割を説明するStringを返す抽象メソッドgetRole()を含めます。Student.java:Userを継承するクラスを作成します。登録されたコースIDを追跡するためのプライベートなArrayListを追加します。親コンストラクタを呼び出すコンストラクタを含め、getRole()を実装して"Student"を返すようにし、addCourse(String courseId)メソッドとgetEnrolledCourseCount()メソッドを追加します。toString()をオーバーライドして、"Student: [name] ([enrolledCount] courses)"を返すようにします。Instructor.java:Userを継承するクラスを作成します。specialty(String) のプライベートフィールドを追加します。id、name、specialtyを受け取るコンストラクタを含め、getRole()を実装して"Instructor"を返すようにし、specialtyのゲッターを追加し、toString()をオーバーライドして"Instructor: [name] - [specialty]"を返すようにします。Course.java:Enrollableを実装するクラスを作成します。courseId(String)、title(String)、instructor(Instructor)、および登録された学生のArrayListのプライベートフィールドを含めます。コンストラクタはcourseId、title、instructorを受け取ります。enroll(Student student)を実装して学生をリストに追加し、その学生のaddCourse()メソッドをこのコースのIDで呼び出し、trueを返します。getEnrolledCount()を実装します。コースIDをリテラルの角括弧で囲み、その後にタイトルと講師名を続けた"[" + courseId + "] " + title + " by " + instructorName形式の文字列を返すgetDetails()メソッドを追加します。Main.java: プラットフォームを構築しましょう!カンマ区切りのコマンド文字列を受け取ります:ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO:userId
講師、学生、およびコースのコレクションを保持します。各コマンドを処理し、以下を出力します:
- ADD_INSTRUCTOR:
Instructor added: [name] - ADD_STUDENT:
Student added: [name] - ADD_COURSE:
Course added: [title] - ENROLL:
[studentName] enrolled in [courseTitle] - INFO: ユーザーの
toString()出力を表示
すべてのコマンドの後、
--- Platform Summary ---を出力し、続いて各コースの詳細と登録者数を[courseDetails] - [count] student(s)の形式で出力します。
入力として、カンマ区切りのコマンド文字列を1つ受け取ります。
例えば、入力が ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001 の場合、出力は以下のようになります:
Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)このチャレンジは、継承(User階層)、インターフェース(Enrollable)、ポリモーフィズム(独自のtoString実装を持つ異なるユーザータイプ)、およびカプセル化(アクセス制御されたプライベートフィールド)を1つのまとまったシステムに統合するものです!
自分で試してみよう
import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: 講師、学生、コースを保存するためのコレクションを作成する
// ヒント: 検索を容易にするため、id をキーとした HashMap を使用する
// TODO: 入力をカンマで分割し、個別のコマンドを取得する
// TODO: 各コマンドを処理する:
// - ADD_INSTRUCTOR:id:name:specialty -> 講師を作成し、コレクションに追加して、"Instructor added: [name]" と出力する
// - ADD_STUDENT:id:name -> 学生を作成し、コレクションに追加して、"Student added: [name]" と出力する
// - ADD_COURSE:courseId:title:instructorId -> 講師を指定してコースを作成し、コレクションに追加して、"Course added: [title]" と出力する
// - ENROLL:studentId:courseId -> 学生をコースに登録し、"[studentName] enrolled in [courseTitle]" と出力する
// - INFO:userId -> ユーザー(学生または講師)を検索し、その toString() を出力する
// TODO: すべてのコマンドを処理した後、"--- Platform Summary ---" と出力する
// TODO: 各コースについて、"[courseDetails] - [count] student(s)" と出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造