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
, email
và gender
vớ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 name
và 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 độ
x
và y
tọ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 int
mả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 đã
MyCircle
cho MyPoint
là center
và 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 this
vò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ừ this
thể 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 MyCircle
lớ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 MyTriangle
lớp học sử dụng ba MyPoint
trườ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
private
biế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
MyTriangle
vớ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 MyRectangle
lớ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 Customer
mô hình lớp khách hàng được thiết kế như thể hiện trong sơ đồ lớp. Viết mã cho Customer
lớp và trình điều khiển kiểm tra để kiểm tra tất cả các public
phương thức.
Các Invoice
lớp, thiết kế như thể hiện trong sơ đồ lớp, soạn một Customer
ví dụ (bằng văn bản trước đó) là thành viên của nó. Viết mã cho Invoice
lớp và trình điều khiển kiểm tra để kiểm tra tất cả các public
phương thức.
2.8 Ex: The Customer and Account classes
Các Customer
mô hình lớp khách hàng được thiết kế như thể hiện trong sơ đồ lớp. Viết mã cho Customer
lớp và trình điều khiển kiểm tra để kiểm tra tất cả các public
phương thức.
Các Account
mô 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 Customer
ví dụ (bằng văn bản trước đó) là thành viên của nó. Viết mã cho Account
lớp và trình điều khiển kiểm tra để kiểm tra tất cả các public
phương thức.
Đăng nhận xét