まず、ランニング効果を見てみましょう
分析してみましょう:
Java では、オブジェクト間の相互作用によって問題が解決されるので、どのようなオブジェクトがあるかを見てみましょう。
最初の 2 つの明らかなオブジェクトは user と book です。したがって、2 つのパッケージ book と user
pass As you を作成します。上の図でわかるように、異なるユーザーは同じ操作を持っていますが、異なる操作も持っているので、すべての操作を 1 つのパッケージに入れて、必要な操作だけを直接呼び出すこともできます。このパッケージには、operate
## という名前を付けました。 #1.book パッケージまず、パッケージ内に Book クラスが必要です。このクラスには、本のタイトル、著者、本の種類、価格、貸出状況などのさまざまな情報が記録されます。すべてプライベートな変更を使用しています。パッケージ内のすべてのクラスにメンバー変数を追加し、後で繰り返さない外部メソッドのみを提供します コードは次のとおりです (コードの一部のみを示します):package book; public class Book { private String name; private String author; private String type; private int price; private boolean borrow; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }
public class BookShelf { private Book[] books=new Book[1000]; private int count; //记录书的数量 }
package book; public class BookShelf { private Book[] books=new Book[1000]; private int count; //记录书的数量 public void setBooks(int pos,Book book) { books[pos] = book; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public BookShelf() { books[0]=new Book("呐喊","鲁迅","小说集",30); //默认初始有一本书,写不写随你 this.count=1; } //获取下标对应的书 public Book pos(int i) { return books[i]; } }
次に、最初にログイン メソッドを書き出してから分析しましょう:
public static void login() { System.out.println("输入姓名:"); Scanner scanner=new Scanner(System.in); String name=scanner.nextLine(); System.out.println("输入你身份:1.管理员 2.普通用户"); int i=scanner.nextInt(); if(i==1) { //管理员 } else { //普通用户 } }
メソッドは、どのような種類のユーザーに基づいているかを決定します。この問題を解決するには、NormalUser と AdminUser の両方に同じ親クラスを継承させ、メソッドは親クラスを返すだけで済みます。 .
親クラス コードは次のとおりです:
public abstract class User { private String name; public User(String name) { this.name = name; } public abstract void menu(); //菜单抽象方法,子类实现 }
サブクラス コード:
public class AdminUser extends User{ public AdminUser(String name) { super(name); } @Override public void menu() { 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("选择操作"); } } public class NormalUser extends User{ public NormalUser(String name) { super(name); } @Override public void menu() { System.out.println("欢迎使用"); System.out.println("1.查找图书"); System.out.println("2.借阅图书"); System.out.println("3.归还图书"); System.out.println("0.退出系统"); System.out.println("选择操作"); } }
異なるユーザーは異なる操作に対応しますが、オペランドは同じであるため、2 つのクラスは次の必要があります。エラーを防ぐためにそれぞれのメソッドを格納する配列であり、この配列はユーザーが選択する前に準備する必要があります。したがって、配列は構築メソッド内にある必要があります。変更されたクラスは次のとおりです:
public abstract class User { private String name; public IOperate[] ioperate; public void chooseOperate(int choice,BookShelf bookShelf) { ioperate[choice].work(bookShelf); } public User(String name) { this.name = name; } public abstract int menu(); } public class AdminUser extends User{ public AdminUser(String name) { super(name); this.ioperate=new IOperate[] { new Exit(), new FindBook(), new AddBook(), new DelBook(), new DisplayBook(), }; } @Override public int menu() { 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 scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; } } public class NormalUser extends User{ public NormalUser(String name) { super(name); this.ioperate=new IOperate[] { new Exit(), new FindBook(), new BorrowBook(), new ReturnBook(), }; } @Override public int menu() { System.out.println("欢迎使用"); System.out.println("1.查找图书"); System.out.println("2.借阅图书"); System.out.println("3.归还图书"); System.out.println("0.退出系统"); System.out.println("选择操作"); Scanner scanner=new Scanner(System.in); int choice=scanner.nextInt(); return choice; } }
3. operate package
インターフェイス コード:
package operate; import book.BookShelf; public interface IOperate { public void work (BookShelf bookShelf); }
Book 操作に関しては、書籍を追加する例を次に示します
次のようにする必要があります。本の情報を知っていて、それを受け取る Book クラスを用意し、最後にそれを配列に入れます。
このロジックによると、前の Book クラスを変更する必要があります。Book にコンストラクター メソッドを追加します。書籍情報を受け取るクラス。配列内のメソッドの位置は、作成したメニュー内の位置に対応する必要があることに注意してください。
public Book(String name, String author, String type, int price) { this.name = name; this.author = author; this.type = type; this.price = price; }
書籍メソッド コードを追加します:
public class AddBook implements IOperate { @Override public void work(BookShelf bookShelf) { System.out.println("请输入图书的名字:"); Scanner scanner = new Scanner(System.in); String name = scanner.nextLine(); System.out.println("请输入图书的作者:"); String author = scanner.nextLine(); System.out.println("请输入图书的类型:"); String type = scanner.nextLine(); System.out.println("请输入图书的价格:"); int price = scanner.nextInt(); Book book = new Book(name,author,type,price); int count=bookShelf.getCount(); bookShelf.setBooks(count,book); bookShelf.setCount(count+1); System.out.println("新增成功"); } }
注:
1. 参照変数はデフォルトで変更されたアドレスを出力するため、ブックの内容を印刷したい場合は、 Book クラス
##2 の toString メソッドをオーバーライドする必要があります。メソッドは終了する前に配列を走査し、リサイクルを容易にするためにそれが指すすべてのオブジェクトを null に変更する必要があります。システムはプログラム終了後にもリサイクルしますが、大規模なプロジェクトの一部のプログラムを一度停止するのはそれほど簡単ではないことを知っておく必要があります。彼らは走り始めます。/以上がJava書籍管理の基本的な関数コードの書き方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。