2. Luyện tập về OOP Composition
2.1 Ex: Ví dụ về hai class Author và Book (Giới thiệu về OOP Composition)
Bài tập đầu tiên này sẽ dẫn bạn qua tất cả các khái niệm liên quan đến Thành phần OOP
(OOP Composition)
Một lớp được gọi Author (như thể hiện trong sơ đồ lớp) được thiết kế để mô hình hóa tác giả của một cuốn sách. Nó chứa:
- Ba biến
private đối tượng: name( String), email( String) và gender( char của một trong hai 'm'hoặc 'f');
- Một constructor để khởi tạo
name, emailvà gendervới các giá trị nhất định;
- (Không có hàm tạo mặc định cho Tác giả, vì không có mặc định cho tên, email và giới tính.)
public getters / setters: getName(), getEmail(), setEmail(), và getGender();
(Không có setters cho namevà gender, vì những thuộc tính này không thể thay đổi.)
- Một
toString()phương thức trả về " Author[name=?,email=?,gender=?]", ví dụ: " Author[name=Tan Ah Teck,email=ahTeck@somewhere.com,gender=m]".
Viết lớp Author. Đồng thời viết trình điều khiển thử nghiệm được gọi TestAuthor để kiểm tra tất cả các public phương thức, ví dụ:
Author codeLean = new Author("Code Lean", "codeleanvn@gmail.com", 'm');
System.out.println(codeLean);
codeLean.setEmail("codelean@gmail.com");
System.out.println("name is: " + codeLean.getName());
System.out.println("eamil is: " + codeLean.getEmail());
System.out.println("gender is: " + codeLean.getGender());
Class Book được thiết kế (như hiển thị trên class diagram) để mô hình hoá một cuốn sách được viết bởi một tác giả one author. Nó chứa:
- Bốn
private instance variables: name (String), author (của class Author mà bạn vừa tạo, lưu ý rằng trong trường hợp này thì mỗi cuốn sách có một và chỉ một tác giả), price(double), và qty (int);
- Hai hàm tạo (constructor):
public Book (String name, Author author, double price) { ...... }
public Book (String name, Author author, double price, int qty) { ...... }
- public methods
getName(), getAuthor(), getPrice(), setPrice(), getQty(), setQty().
- Phương thức
toString() sẽ trả về "Book[name=?,Author[name=?,email=?,gender=?],price=?,qty=?". Bạn có thể tái sử dụng Author’s toString().
Để viết một class Book (có sử dụng class Author được viết trước đó). Đồng thời cũng viết test driver TestBook để test tất cả các method public trong class Book. Chú ý rằng Book phải có constructor của một instance của lớp Author trước khi bạn có instance của constructor của Book. E.g.,
Author codeLean = new Author("Code Lean", "codeleanvn@gmail.com", 'f');
System.out.println(codeLean);
Book dummyBook = new Book("Java for dummy", codeLean, 19.95, 99);
System.out.println(dummyBook);
dummyBook.setPrice(29.95);
dummyBook.setQty(28);
System.out.println("name is: " + dummyBook.getName());
System.out.println("price is: " + dummyBook.getPrice());
System.out.println("qty is: " + dummyBook.getQty());
System.out.println("Author is: " + dummyBook.getAuthor());
System.out.println("Author's name is: " + dummyBook.getAuthor().getName());
System.out.println("Author's email is: " + dummyBook.getAuthor().getEmail());
Book anotherBook = new Book("more Java",
new Author("Dang Kim Thi", "dangkimthi@gmail.com", 'f'), 29.95);
System.out.println(anotherBook);
Hãy lưu ý rằng cả hai lớp Book và Author có một biến được gọi là name. Tuy nhiên, nó có thể được phân biệt thông qua thể hiện tham chiếu. Ví dụ Book aBook, aBook.name đề cập đến name cuốn sách; trong khi đó Author, ví dụ của một tác giả auAuthor, anAuthor.name đề cập đến name tác giả. Không nên đặt tên biến là bookName và authorName.
THỬ:
- In ra
name và email của tác giả từ một Book nào đó. (Gợi ý : aBook.getAuthor().getName(), aBook.getAuthor().getEmail()).
- Giới thiệu các phương pháp mới gọi
getAuthorName(), getAuthorEmail(), getAuthorGender()trong lớp Book để trả lại name, email và gender các tác giả của cuốn sách. Ví dụ,
public String getAuthorName() {
return author.getName();
}
2.2 Luyện Tập (Nâng Cao): Book và Author
Tiếp tục luyện về Class - trong đó Một mảng của đối tượng coi như một Instance Variable

Trong bài tập trước , một cuốn sách được viết bởi một và chỉ một tác giả. Trong thực tế, một cuốn sách có thể được viết bởi một hoặc nhiều tác giả. Sửa đổi lớp Book để hỗ trợ một hoặc nhiều tác giả bằng cách thay đổi biến authors thể hiện thành một biến thành một Author mảng.
Ghi chú:
- Các constructor lấy một mảng
Author(ví dụ, Author[]), thay vì một Author thể hiện. Trong thiết kế này, một khi một Book thể hiện là hàm tạo, bạn không thể thêm hoặc xóa tác giả.
- Các
toString()phương pháp sẽ trở lại " Book[name=?,authors={Author[name=?,email=?,gender=?],......},price=?,qty=?]".
Bạn được yêu cầu:
- Viết mã cho class
Book. Bạn sẽ sử dụng lại các class Author được viết trước đó.
- Viết trình test driver (được gọi
TestBook) để kiểm tra lớp Book.
Gợi ý :
Author[] authors = new Author[2];
authors[0] = new Author("Tan Ah Teck", "AhTeck@somewhere.com", 'm');
authors[1] = new Author("Paul Tan", "Paul@nowhere.com", 'm');
Book javaDummy = new Book("Java for Dummy", authors, 19.99, 99);
System.out.println(javaDummy);
2.3 Ex: MyPoint Class
Một lớp được gọi MyPoint, mô hình điểm 2D x và y tọa độ, được thiết kế như thể hiện trong sơ đồ lớp. Nó chứa:
- Hai biến đối tượng
x( int) và y( int).
- Hàm tạo mặc định (hoặc "không đối số") xây dựng một điểm tại vị trí mặc định của
(0, 0).
- Một hàm tạo quá tải xây dựng một điểm với các tọa độ
xvà ytọa độ đã cho.
- Getter và setter cho các biến thể hiện
x và biến thể hiện y .
- Một phương pháp
setXY()để đặt cả hai x và y.
- Một phương thức
getXY()trả về x và y trong intmảng 2 phần tử .
- Một
toString()phương thức trả về một mô tả chuỗi của thể hiện ở định dạng " ".(x, y)
- Một phương thức được gọi là
distance(int x, int y)trả về khoảng cách từ điểm này tới điểm khác tại toạ điển đã cho (x, y), ví dụ
MyPoint p1 = new MyPoint(3, 4);
System.out.println(p1.distance(5, 6));
- Một ví dụ khác về gọi hàm tính khoảng cách, trong trường hợp này thì x,y của điểm 2 là (5,6)
MyPoint p1 = new MyPoint(3, 4);
MyPoint p2 = new MyPoint(5, 6);
System.out.println(p1.distance(p2));
- Một ví dụ khác nữa về tính khoảng cách, trong trường hợp này thì x,y của điểm 2 là (0,0)
MyPoint p1 = new MyPoint(3, 4);
System.out.println(p1.distance());
Bạn được yêu cầu:
- Viết mã cho lớp
MyPoint. Cũng viết một chương trình thử nghiệm (được gọi TestMyPoint) để kiểm tra tất cả các phương thức được định nghĩa trong lớp.
Gợi ý:
public double distance(int x, int y) {
int xDiff = this.x – x;
int yDiff = ......
return Math.sqrt(xDiff*xDiff + yDiff*yDiff);
}
public double distance(MyPoint another) {
int xDiff = this.x – another.x;
.......
}
MyPoint p1 = new MyPoint();
System.out.println(p1);
p1.setX(8);
p1.setY(6);
System.out.println("x is: " + p1.getX());
System.out.println("y is: " + p1.getY());
p1.setXY(3, 0);
System.out.println(p1.getXY()[0]);
System.out.println(p1.getXY()[1]);
System.out.println(p1);
MyPoint p2 = new MyPoint(0, 4);
System.out.println(p2);
System.out.println(p1.distance(p2));
System.out.println(p2.distance(p1));
System.out.println(p1.distance(5, 6));
System.out.println(p1.distance());
- Viết một chương trình định vị
10 điểm trong một mảng của MyPoint, và khởi (1, 1), (2, 2)... (10, 10).
Gợi ý : Bạn cần phân bổ mảng, cũng như mỗi trong số 10 MyPoint instance. Nói cách khác, bạn cần phát hành 11 new, 1 cho mảng và 10 cho các MyPoint instance. Write a program that allocates 10 points in an array of MyPoint, and initializes to (1, 1), (2, 2), ... (10, 10).
Hints: You need to allocate the array, as well as each of the 10 MyPoint instances. In other words, you need to issue 11 new, 1 for the array and 10 for the MyPoint instances.
MyPoint[] points = new MyPoint[10];
for (int i = 0; i < points.length; i++) {
points[i] = new MyPoint(...);
}
2.4 Ex: Lớp MyCircle và MyPoint
Một lớp được gọi MyCircle, mô hình một vòng tròn với a center (x,y)và a radius, được thiết kế như thể hiện trong sơ đồ lớp. Các MyCircle sử dụng một thể hiện của MyPoint (được tạo trong bài tập trước) như nó center.
Lớp chứa:
- Hai
biến đối tượng private: center(một thể hiện của MyPoint) và radius( int).
- Một hàm tạo xây dựng một vòng tròn với tâm (
x, y) và radius.
- Một hàm tạo quá tải xây dựng một thể hiện đã
MyCirclecho MyPointlà centervà radius.
- Một constructor mặc định xây dựng một vòng tròn có tâm tại
(0,0)và bán kính của 1.
- Getters và setters khác nhau.
- Một
toString()phương thức trả về một mô tả chuỗi của thể hiện này ở định dạng " ". Bạn sẽ tái sử dụng của .MyCircle[radius=r,center=(x,y)]toString()MyPoint
getArea()và getCircumference()các phương thức trả về diện tích và chu vi của thisvòng tròn trong double.
- Một
distance(MyCircle another)phương thức trả về khoảng cách của các trung tâm từ thisthể hiện và thể hiện đã cho MyCircle. Bạn nên sử dụng MyPoint's distance()phương pháp để tính toán khoảng cách này.
Viết MyCirclelớp. Cũng viết một trình điều khiển thử nghiệm (được gọi TestMyCircle) để kiểm tra tất cả các phương thức công khai được định nghĩa trong lớp.
Gợi ý :
public MyCircle(int x, int y, int radius) {
center = new MyPoint(x, y);
this.radius = radius;
}
public MyCircle(MyPoint center, int radius) {
this.center = center;
......
}
public MyCircle() {
center = new MyPoint(.....);
this.radius = ......
}
public int getCenterX() {
return center.getX();
}
public double distance(MyCircle another) {
return center.distance(another.center);
}
2.5 Ex: The MyTriangle and MyPoint Classes
Một lớp được gọi MyTriangle, mô hình một tam giác có 3 đỉnh, được thiết kế như hình. Các MyTrianglelớp học sử dụng ba MyPointtrường hợp (được tạo trong việc thực hiện trước đó) là ba đỉnh của nó.
Nó chứa:
- Ba
privatebiến Ví dụ v1, v2, v3(trường hợp MyPoint), cho ba đỉnh.
- Một nhà xây dựng mà xây dựng một
MyTrianglevới ba bộ tọa độ, v1=(x1, y1), v2=(x2, y2), v3=(x3, y3).
- Một constructor quá tải xây dựng
MyTriangle với 3 đối tượng MyPoint.
- Một
toString()phương thức trả về một mô tả chuỗi của thể hiện ở định dạng " ".MyTriangle[v1=(x1,y1),v2=(x2,y2),v3=(x3,y3)]
- Một
getPerimeter()phương thức trả về độ dài của chu vi. Bạn nên sử dụng distance()phương pháp chu phương pháp MyPoint để tính toán chu vi.
- Một phương thức
printType()in " equilateral" nếu tất cả ba cạnh bằng nhau ", isosceles" nếu bất kỳ hai trong ba cạnh bằng nhau hoặc " scalene" nếu ba cạnh khác nhau.
Viết class MyTriangle. Cũng viết một trình điều khiển thử nghiệm (được gọi TestMyTriangle) để kiểm tra tất cả các phương thức được định nghĩa trong lớp.
2.6 Ex: The MyRectangle and MyPoint Classes
Thiết kế một MyRectanglelớp bao gồm hai thiết kế bao gồm haiMyPoint trường hợp là các góc trên cùng bên trái và dưới cùng bên phải của nó . Vẽ sơ đồ lớp, viết mã và viết trình điều khiển kiểm tra.
2.7 Ex: The Customer and Invoice classes
Các Customermô hình lớp khách hàng được thiết kế như thể hiện trong sơ đồ lớp. Viết mã cho Customerlớp và trình điều khiển kiểm tra để kiểm tra tất cả các publicphương thức.
Các Invoicelớp, thiết kế như thể hiện trong sơ đồ lớp, soạn một Customerví dụ (bằng văn bản trước đó) là thành viên của nó. Viết mã cho Invoicelớp và trình điều khiển kiểm tra để kiểm tra tất cả các publicphương thức.
2.8 Ex: The Customer and Account classes
Các Customermô hình lớp khách hàng được thiết kế như thể hiện trong sơ đồ lớp. Viết mã cho Customerlớp và trình điều khiển kiểm tra để kiểm tra tất cả các publicphương thức.
Các Accountmô hình lớp một tài khoản ngân hàng, thiết kế như thể hiện trong sơ đồ lớp, soạn một Customerví dụ (bằng văn bản trước đó) là thành viên của nó. Viết mã cho Accountlớp và trình điều khiển kiểm tra để kiểm tra tất cả các publicphương thức.
Đăng nhận xét