目次
序文
この記事は、Java のクラスとオブジェクト間の関係、および問題を解決するための継承とポリモーフィズムの使用を完全に反映した Java 学習プロセスにおける実践的なプロセスです。この記事はちょっとした授業計画として使用でき、必要な生徒は自分で手に入れることができます。ソースコードは記事の最後に載せておきます!!
1. 独創的なアイデア
始まったばかりのプロジェクトの場合、プロジェクトを作成する前に、明確なアイデアが必要です。次に、私の考えを分析してみましょう。
1. ライブラリ管理システムの場合、管理者とユーザーがそれぞれ存在します (ここではデータベースは実装されていません。JavaSE の簡単な概要だけです)。ユーザー クラスはここで生成されます。
2. 使う人を決める 次に本の問題ですが、まず本を説明するための本クラスが必要で、次に本を保管するための本棚クラスが必要です。
3. 上記 2 つの問題が決まれば、あとは書籍管理ですので、さまざまな書籍管理クラス (クラスの追加、クラスの削除、クラスの借用、クラスの返却など) を定義する必要があります。
この記事は完全に私の第一の視点で書かれています。すべてのプロセスが明確です。!!
2. 全体的な論理フレームワークを構築する
2.1 ユーザークラスの定義
まずユーザークラスを定義します
public abstract class User {
protected String username;
public User(String username) {
this.username = username;
}
}
次に、管理者クラスと一般ユーザークラスをそれぞれ定義し、ユーザークラスを継承します(なぜ継承する必要があるかについては、後ほど説明します)
一般ユーザークラス:
public class NormalUser extends User{
public NormalUser(String username) {
super(username);
}
}
管理者クラス:
public class AdminUser extends User{
public AdminUser(String username) {
super(username);
}
}
ユーザークラスを定義したら、ブッククラスの定義を開始します。
2.2 本と本棚の定義
ここでは本のタイトル、著者、価格、種類、貸し出すかどうかだけを定義します。実際のニーズに応じて他のものを追加できます。次に、対応する set メソッドと get メソッド、および toString メソッドを生成します。
public class Book {
private String bookName;
private String author;
private double price;
private String type;
private boolean isBorrow;
//boolean初始值是false这里就不将其加入构造方法了
public Book(String bookName, String author, double price, String type) {
this.bookName = bookName;
this.author = author;
this.price = price;
this.type = type;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isBorrow() {
return isBorrow;
}
public void setBorrow(boolean borrow) {
isBorrow = borrow;
}
@Override
public String toString() {
return "Book{" +
"bookName='" + bookName + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +","+
((isBorrow==true)?"已借出":"未借出") +
'}';
}
}
本を手に入れたら、次は本を置く本棚です。
public class BookRack {
private Book[] books = new Book[10];//书架最多存放的书,根据实际需求来
private int bookCount;//目前书架的书的数量
//初始化的时候书架就有三本书,根据自己的需求来
public BookRack(){
books[0] = new Book("三国演义","罗贯中",29.9,"小说");
books[1] = new Book("西游记","吴承恩",39.9,"小说");
books[2] = new Book("水浒传","施耐庵",19.9,"小说");
this.bookCount = 3;//将书架的书变为三
}
}
これを書いたら、基本的にメインコンテンツを書き始めることができます。
2.3 main関数の記述
大まかなフレームワークを記述したら、次はプログラムの入り口ですが、まずログインメソッドが必要です。
public class Main {
public static void login(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = sc.nextLine();
System.out.println("请输入登录身份:1->管理员登录 0->用户登录");
int choice = sc.nextInt();
if(choice == 1){
System.out.println(name + " 管理员,欢迎您登录图书管理系统!");
}else{
System.out.println(name + " 用户,欢迎您登录图书管理系统!");
}
}
public static void main(String[] args) {
login();
}
}
さて、これを書いているときに問題を発見しました。ログインしているのが管理者なのかユーザーなのかわかりません。!!ここが重要なポイントです!!!オブジェクトを使用して受信できますか? さて、ここで再び質問が来ます。ここでは 2 つの異なるオブジェクトを返します。1 つはユーザー用、もう 1 つは管理者用です。では、誰を返せばよいでしょうか? もちろん、親クラスのオブジェクトを返します (これが継承が必要な理由です)。!!この問題は昇進すれば完全に解決できます。ぜひ実行してください。上記のコードをすぐに変更してください
public class Main {
public static User login(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = sc.nextLine();
System.out.println("请输入登录身份:1->管理员登录 0->用户登录");
int choice = sc.nextInt();
if(choice == 1){
System.out.println(name + " 管理员,欢迎您登录图书管理系统!");
//选管理员我就返回管理员对象
return new AdminUser(name);
}else{
System.out.println(name + " 用户,欢迎您登录图书管理系统!");
//选用户我就返回用户对象
return new NormalUser(name);
}
}
public static void main(String[] args) {
User user = login();
}
}
コードを変更した後、どのオブジェクトがログインしているかがわかりました。次に、関数インターフェイスを実装します。
2.4 機能インターフェイスの実装
ユーザーごとに異なる機能インターフェイスが必要ですが、ここでは詳しく説明しませんが、実際のニーズに基づいて決まります。
管理者機能インターフェース:
public class AdminUser extends User{
public AdminUser(String username) {
super(username);
}
@Override
public int menu() {
System.out.println("**************************************");
System.out.println("*** 请输入您的操作: ***");
System.out.println("*** 1.查找图书 ***");
System.out.println("*** 2.添加图书 ***");
System.out.println("*** 3.删除图书 ***");
System.out.println("*** 4.显示图书 ***");
System.out.println("*** 0.退出系统 ***");
System.out.println("**************************************");
Scanner sc = new Scanner(System.in);
//我后面选了什么是不是要做一个记录?这样才能知道我选了哪个操作
int choice = sc.nextInt();
return choice;
}
}
ユーザー機能インターフェース:
public class NormalUser extends User{
public NormalUser(String username) {
super(username);
}
@Override
public int menu() {
System.out.println("**************************************");
System.out.println("*** 请输入您的操作: ***");
System.out.println("*** 1.查找图书 ***");
System.out.println("*** 2.借阅图书 ***");
System.out.println("*** 3.归还图书 ***");
System.out.println("*** 0.退出系统 ***");
System.out.println("**************************************");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
次に、オブジェクトを通じて関数インターフェイスのメソッドを呼び出す必要があります。
2.5 関数インターフェースの呼び出し
ここで、親クラスのオブジェクトを介してサブクラスのメソッドを呼び出すのがポリモーフィズムの考え方です。!!
public static void main(String[] args) {
User user = login();
//只要我还没有退出程序我就需要进行操作选择,所以这里需要写一个循环
while (true) {
int choice = user.menu();
}
}
さて、これを書いた後に問題が発生しました(当時私は混乱していました)?いきなり発見!WOC サブクラスは、親クラスのメソッドをオーバーライドしないとポリモーフィック条件を達成できません。私の親クラスにはこのメソッドがありません (ここで理解できない場合は、私のホームページにあるポリモーフィックの記事をご覧ください)。!!早く追加してね
public abstract class User {
protected String username;
IOperation[] iOperations;
public User(String username) {
this.username = username;
}
//因为这个方法不需要实现什么内容,直接给他抽象了
public abstract int menu();
}
さて、これを書くことで大枠は完成したと考えて良いでしょう!しかし、問題は再び起こります!操作に対応する番号を選択しましたが、対応するメソッドを呼び出すにはどうすればよいでしょうか (能動的に考えてください)。それは具体的な操作内容に関わるものなので、記事が長すぎると絶対に読みたくないですよね!次回何が起こったのか知りたい場合は、内訳を聞いてください。!!または、 http://t.csdn.cn/lf0Ijに直接ジャンプします。
要約する
この記事では、ライブラリ管理システムの前半部分(全体の論理フレームワークの構築)を中心に、プログラミングの全体の流れを私の視点で解説していますので、必ず理解できます!わからなかったら二回叩いてください!!!