You are on page 1of 7

1.

Từ khóa friend trong C++ có làm vi phạm (violate) tính chất data hiding
của OOP hay không? Tại sao? Giải thích.

- Từ khóa friend không làm vi phạm (violate) tính chất data hiding của OOP
nếu nó được dùng với một mục đích nhất định, chảng hạn như để cài đặt
các mối quan hệ giữa các lớp và khả năng đa năng hóa toán tử trên lớp, về
cơ bản các hàm/lớp friend này phải được khai báo một cách rõ ràng và cụ
thể trong định nghĩa của class. Điều này có nghĩa là class này chỉ cung cấp
quyền truy cập vào các thuộc tính private của nó cho một số hàm/lớp friend
nhất định mà nó “tin tưởng”, chứ không phải cho bất kì hàm/lớp nào ngoài
class cũng có thể sử dụng.

2. Trong Java, có từ khóa friend không? Nếu có, cho ví dụ minh họa. Nếu ko
có, cho biết có cơ chế nào tương tự friend không và cho ví dụ minh họa.

- Trong Java, không có từ khóa friend và có một cơ chế tương tự friend đó là


getter, setter.

VD:

public class Person {

private String name;

// Getter

public String getName() {

return name;

// Setter

public void setName(String newName) {

this.name = newName;

}
}

public class Main {

public static void main(String[] args) {

Person myObj = new Person();

myObj.name = "John"; // error

System.out.println(myObj.name); // error

public class Main {

public static void main(String[] args) {

Person myObj = new Person();

myObj.setName("John"); // Set the value of the name variable


to "John"

System.out.println(myObj.getName());

// Outputs "John"

3. Đọc về tính chất inheritance của OOP. Tìm hiểu về khái niệm override a
method in achild/sub/derived class.

- Kế thừa là gì?
Kế thừa (inheritance) là một tính chất đặc trưng của lập trình hướng
đối tượng. Nó có nghĩa là một class thừa hưởng lại tất cả các thuộc tính,
phương thức của class mà nó kế thừa. Class kế thừa từ một class khác gọi là
lớp con (child class hay subclass) hay lớp dẫn xuất (derived class). Class
được lớp khác kế thừa được gọi là lớp cha (parent class hay superclass) hay
lớp cơ sở (base class).
VD: Với class con người, có các thuộc tính cơ bản như họ tên, ngày sinh,
quê quán, mình khai báo thêm một class sinh viên kế thừa từ class con
người. Vậy, class sinh viên sẽ có các thuộc tính họ tên, ngày sinh, quê
quán từ class con người mà không cần phải khai báo. Class con người sẽ
là lớp cha và class sinh viên là lớp con.

- Ưu điểm:

- Tính kế thừa giúp tăng khả năng tái sử dụng. Khi một lớp kế thừa hoặc dẫn
xuất một lớp khác, thì nó có thể truy cập tất cả các chức năng của lớp mà nó
kế thừa.

- Khả năng tái sử dụng nâng cao độ tin cậy. Chúng ta chỉ cần kiểm tra và gỡ
lỗi với mã lớp cha, chứ không cần kiểm tra từng lớp con.

- Khi mã được tái sử dụng, sẽ giúp giảm chi phí phát triển và bảo trì.

- Các lớp con sẽ tuân thủ theo một giao diện (interface) chuẩn.

- Tính kế thừa giúp hạn chế sự dư thừa mã và hỗ trợ khả năng mở rộng mã.

- Lập trình viên có điều kiện thuận lợi để tạo các thư viện lớp (class
libraries).

- Nhược điểm:

- Các chức năng được kế thừa hoạt động chậm hơn chức năng bình
thường, vì nó được thực hiện gián tiếp (lấy từ lớp cha) chứ không phải trực
tiếp.

- Thông thường, các dữ liệu thành viên trong lớp cha không được sử dụng.
Điều này có thể dẫn đến lãng phí bộ nhớ.

- Tính kế thừa làm tăng sự kết nối giữa lớp cơ sở và lớp kế thừa. Một thay
đổi trong lớp cha sẽ ảnh hưởng đến tất cả các lớp con.

- Nếu sử dụng Tính kế thừa không đúng cách có thể dẫn đến các cách giải
quyết sai lầm sau này.
- Các loại kế thừa:

Kế thừa đơn
Kế thừa đơn (single inheritance) là một class con kế thừa duy nhất từ một
class cha. Ví dụ như class sinh viên chỉ kế thừa duy nhất từ class con người,
đó là một kế thừa đơn.

Kế thừa đa cấp
Kế thừa đa cấp (multilevel
inheritance) là một class con kế thừa từ
một class cha, class cha đó lại kết thừa từ
một lớp khác. Ví dụ như class sinh viên kế
thừa từ class học sinh, class học sinh lại kế
thừa từ class con người, đó là một kế
thừa đa cấp.

Kế thừa phân cấp


Kế thừa phân cấp (hierarchical
inheritance) là khi có nhiều hơn một class con
kế thừa từ class cha. Ví dụ như class sinh viên
và class công nhân đều kế thừa từ class cha là
con người.

pháp:

class <tên_class_con> : <phạm_vi_truy_cập> <tên_class_cha> {

// code goes here

};
Phạm vi truy cập:

Override:
Trong khi sử dụng tính kế thừa, bạn sẽ gặp phải trường hợp hai phương
thức ở class con và class cha trùng tên nhau. Trong trường hợp này,
phương thức được khai báo và định nghĩa ở class con sẽ ghi đè lên phương
thức ở class cha và thay thế hoàn toàn nó.

VD:

class A

{
public:
void sayHello()
{
cout << "Hello World\n";
}
};

class B : public A
{
public:
void sayHello()
{
cout << "Hello Viet Nam";
}
};

int main() {
B b;
b.sayHello();
return 0;
}

- Output:

Vậy nếu như mà phương thức bị trùng tên thì nó bị ghi đè, vậy thì không còn
đảm bảo được tính tái sử dụng code của tính kế thừa. Vậy làm sao chúng ta
có thể tái sử dụng lại đoạn code của phương thức ở class cha? Trong trường
hợp này, ta sử dụng toán tử phân giải phạm vi (::), chúng ta có thể gọi được
phương thức từ class cha, ngoài ra chúng ta còn có thể bổ sung được những
đoạn code của riêng phương thức ở class con. 

VD:

class A
{
public:
void sayHello()
{
cout << "Hello World\n";
}
};

class B : public A
{
public:
void sayHello()
{
A::sayHello();
cout << "This is Viet Nam !";
}
};

int main() {
B b;
b.sayHello();
return 0;
}

- Output:

You might also like