Hỏi về viết hàm tạo trong lập trình hướng đối tượng


Mọi người ơi cho mình hỏi lớp Square thì hàm tạo Square(double side, String color, boolean filled) viết như nào ạ
Mình gọi super thì nó lỗi
Sao phần thuộc tính không có double side ạ
Mong mọi người giải đáp

side chính là #width với #length đó.

3 Likes

sao ở đó lại khai báo thêm double side vậy ạ ?

Nó là tham số chứ ko phải thuộc tính bạn.

3 Likes

thế giờ mình sửa như thế nào ạ

nói vậy thế cái hàm tạo Square(double side) giờ mình viết sao ạ ?

Bạn chỉ giúp mình 2 cái hàm tạo này với ạ
Mình không biết phải làm như thế nào luôn

Hình chữ nhật thì có cạnh dàicạnh rộng. Còn hình vuông thì chỉ có cạnh, vì dài và rộng lúc này là một (bằng nhau) và bằng cạnh luôn rồi.

Hàm dựng (tạo) gọi đến các thuộc tính của lớp cơ sở (cha, mẹ hay super gì đấy) để gán giá trị.

Tên tham số là do mình đặt, đâu phải có đúng tên đó thì mới gán được.

2 Likes

Những mà cái String color và boolean filled nằm ở lớp ông mà
mình gọi super không được

Lớp nào mà chả được. Chỉ cần có kế thừa nối tiếp là gọi được.
Nhớ là dùng thuộc tính đấy.

2 Likes

Bạn phải xây dựng lớp từ trên xuống chứ :smiley:

super() luôn được gọi ngầm trong hàm dựng, bạn chỉ thay tham số cho phù hợp :smiley:

3 Likes

Mình gọi super(color, filled) của lớp Shape mà bị lỗi nè

Cái này mình cũng biết,nhưng giờ 1 bên thì 3 ts, 1 bên thì 4

Bạn để mấy trường giá trị đó là private hay protected vậy? Trong hình là protected hết đấy.
Mà quên, chẳng liên quan gì.

Hỏi bạn câu này: bạn đã biết đến khái niệm và cách sử dụng cái gọi là “thuộc tính” (property) trong Java chưa?
Thuộc tính chính là chỗ getXXX()setXXX() đấy.

1 Like

class Square có getSide với setSide đủ rồi, hàm setWidth với setLength hơi thừa

3 Likes

Đúng vậy, hai phương thức (in đậm) là “thửa” lại của superclass :smiley:

4 Likes

Thấy class super đâu có hai hàm này, mà nếu có thì chuyển xuống class con tối ưu hơn. Do nó ko phải cái chung nhất, chỉ có rectangle có width/length còn square, circle và một số shape khác đâu cần

2 Likes

Theo logic toán học thì hình vuông cũng là hình chữ nhật do đó class Square là class con của class Rectangle cũng có width và height là ok mà bạn, ngoài ra do đặc tính width và height bằng nhau nên mới đẻ ra thêm khái niệm mới gọi là side. Thiết kế class vậy ổn rồi

4 Likes

Thanks, mình đã hiểu

1 Like

Vậy thì gộp hai class thành một Rectangle concrete thôi chứ Square nó có thêm điều kiện thôi :smiley:

Vả lại khi để Square thừa kế Rectangle tức là rơi vào trường hợp kinh điển:

Rectangle rect = new Square(42.,"",false);
rect.setWidth(40.); // nó là hình chữ nhật mà
rect.setHeight(30.);
// bây giờ diện tích = mấy? :D

Do vậy, subclass phải mở rộng khả năng superclass, chứ không “trói tay” superclass.

3 Likes

Đó là lý do để ghi đè lại.
Ghi đè cả 2 setter để khi 1 setter được gọi thì gán giá trị giống vậy cho setter còn lại.
Kiểu như này.

@Override public void setWidth(float w){
    super.setWidth(w);
    super.setHeight(w);
}

Gọi đến setSide() thì hay hơn. Nhưng lưu ý, tránh vô tình “dính” đệ quy vòng tròn (vô tận).

2 Likes

Như vậy không giải quyết được vấn đề vì hình chữ nhật thì chiều ngang width không có ràng buộc gì với chiều cao height cả, nhưng hình vuông thì có, đi ngược với nguyên tắc Liskov (chữ L trong SOLID).

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?