Lập trình

Lập trình

Thứ Bảy, 29 tháng 10, 2016

[OOP] Những chú ý về OOP trong Java (updating)

- Khi ta tạo một hàm cùng tên với class (ý muốn tạo hàm constructor ) nhưng lại có kiểu trả về : void, int, double, ... Thì hàm đó không phải là một constructor mà nó là method bình thường, có thể gọi được. Vì constructor là một method đặc biệt không có kiểu trả về.

- Trong hàm khởi tạo của base class gọi một method public (derive class có thể inheritant được) thì hàm được gọi đó vẫn ở subclass . 2 hàm cùng tên nhưng private ở baseclass và super class là 2 hàm khác nhau không phải override của nhau

- Khi create 1 instance của class (blueprint) thì nó khởi tạo root (Object -> ... ) của cây thừa kế xong mới thừa kế dần đến nó. (Nhắc lại là Object khác với Instance, hiểu đơn giản là Instance là thực thể đã nằm trong ô nhớ, hệ điều hành đã cấp phát và đang quản lý nó, còn object bao gồm cả instance và nhưng đối tượng sẽ được tạo ra).

- Khi tạo một mảng n phần tử, java sẽ tạo ra n tham chiều có kiểu là kiểu của từng phần tử, ban đâu tất cả các tham chiều đó trỏ đền null, muốn những tham chiều này trỏ đến đối tượng cần thêm đoạn:
p[n] = new TypeElement();

[Casting]
+ Muốn down casting (from superclass to sub class) trong tham đầu vào của hàm constructor thì cần ép kiểu explicit : (Employee)ob (ob là object của Person) ta muốn tham số truyền vào kiểu Employee
+ int i = (int)12.5f; là chuyển kiểu hẹp (narrow casting). Nếu không có toán tử casting sẽ dẫn đến lỗi

Đoạn code này :
int big = 1234567890;
float approx = big;
System.out.println(big - (int)approx);

Có kết quả là -46, lý do là vì kiểu float không biểu diễn đến 9 chữ số có nghĩa.

[Abstract class and Interface]
- Đôi khi ta muốn tạo 1 class tổng thể để phục vụ cho thừa kế để giảm số lần viết mã, và đễ bảo trì; và phục vụ cho đa hình để xây dựng một cách tổng quát và chỉ cho lớp con sử dụng những method được đánh dấu ở lớp cha dùng chung cho tất cả lớp con. Ví dụ Animal là lớp cha cho tất cả MÈo, Chó, Ngan. Ta muốn lập trình viên chỉ tạo đối tượng cho các lớp con ít trừu tượng hơn là Chó , Ngan, Mèo không muốn cho lớp Animal vì ta không biết 1 con Animal chung chung nó thế nào => không được tạo đối tượng cho Animal => Abstract class.

+ Các lớp cụ thể (concrete) là các lớp có đủ đặc trưng để có thể tạo một đối tượng, khác với abstract class nó quá trừu tượng để create một object

+ Các phương thức trừu tượng phải được cài đè ở lớp con. Các phương thức trừu tượng trong các lớp trừu tượng không có nội dung, nó chỉ phục vụ mục đích đa hình. Điều đó có nghĩa là các lớp cụ thể đầu tiên nằm bên dưới nó trên cây phả hệ bắt buộc phải cài đặt tất cả các phương thức trừu tượng; các lớp con trừu tượng có thể bỏ qua việc này

+ Trong một abstract class có thể có các phương thức abstract hoặc cũng có thể có các phương thức đã triển khai, các phương thức đã triển khai này khi được gọi sẽ gọi các phương thức của đối tượng gọi nó. Điều này cho thấy một sức mạnh của đa hình: dùng lớp con tổng quát như lớp cha nhưng xử lý method lại là đặc trưng của lớp con. Ví dụ: Lớp abstract Shape (dễ thấy Shape quá trừu tượng, ta không thể tưởng tượng một đối tượng kiểu Shape như thế nào, không đặc trưng nên ta cho nó là abstract class) có 2 abstract method là draw() và erase() (các lớp thừa kế lớp Shape như Circle, Rectange sẽ draw() và erase() theo kiểu riêng của một class cụ thể nên ta để abstract) và một method nữa là moveTo() (đây là phương thức được triển khai cụ thế với 3 bước erase() -> thay đổi tọa độ -> draw(). Dễ thấy với mọi object thuộc class thừa kế lại Shape đều được moveTo với 3 bước chung như trên. Nhưng tại mỗi đối tượng thuộc 1 kiểu khác nhau sẽ xử lý nó theo phong cách đặc trưng của nó : erase() và draw() theo các của nó). Ví dụ này minh họa cho một mẫu thiết kế là template method.

Bài viết vẫn đang tiếp tục được update .