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
Square(double side, String color, boolean filled)
viết như nào ạside
chính là #width
với #length
đó.
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.
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ài và cạ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.
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.
Bạn phải xây dựng lớp từ trên xuống chứ
super()
luôn được gọi ngầm trong hàm dựng, bạn chỉ thay tham số cho phù hợp
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()
và setXXX()
đấy.
class Square có getSide với setSide đủ rồi, hàm setWidth với setLength hơi thừa
Đúng vậy, hai phương thức (in đậm) là “thửa” lại của superclass
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
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
Thanks, mình đã hiểu
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
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.
Đó 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).
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).