Abtract Vs Interface

Một bài so sánh khá hay về Abtract và interface từ trang gockinhnghiem

Theo quan điểm cá nhân Abtract là để dùng khi thiết kế Object (Status, Behaviour)

Còn Interface là để dùng khi khai báo hành vi (Behaviour).

Một Object thì có những hành vi. Có thể nói, Interface là chia nhỏ hơn của Object. Nó có mặt cũng để phục vụ cho Object.

Về mặt tư tưởng là như vậy, còn về mặt cú pháp thì trích một câu trả lời ở SOF.

The key technical differences between an abstract class and an interface are:

* Abstract classes can have constants, members, method stubs (methods without a body) and defined methods, whereas interfaces can only have constants and methods stubs.

* Methods and members of an abstract class can be defined with any visibility, whereas all methods of an interface must be defined as public (they are defined public by default).

* When inheriting an abstract class, a concrete child class must define the abstract methods, whereas an an abstract class can extend another abstract class and abstract methods from the parent class don't have to be defined.

* Similarly, an interface extending another interface is not responsible for implementing methodsfrom the parent interface. This is because interfaces cannot define any implementation.

* A child class can only extend a single class (abstract or concrete), whereas an interface can extend or a class can implement multiple other interfaces.

*
A child class can define abstract methods with the same or less restrictive visibility, whereas a class implementing an interface must define the methods with the exact same visibility (public).

Nguyên tắc lập trình SOLID

solid-object-oriented-design

  • Single Responsibility principle: một class chỉ giữ một trách nhiệm duy nhất. Chỉ có thể thay đổi class vì một lí do duy nhất. Nếu bạn ko thể diễn đạt trong một câu, trách nhiệm của class là gì ? 95% là bạn thiết kế tồi.
  • Open/Close principle: có thể thoải mái mở rộng một module, nhưng hạn chế sửa đổi trong module đó.
  • Liskov Substitution principle: trong một CT, các object của class con có thể thay thế class cha mà không làm thay đổi tính đúng đắn của chương trình. Điều này có nghĩa là gì: là class con phải bao hàm đầy đủ tất cả các tính chất của class cha. Lấy ví dụ như một thiết kế: Class VitBau, Vitxiem extend từ class Vit, class VitChayPin cũng có các tính chất như bơi, kêu quác quác, tuy nhiên nó có một tính chất mà ko đáp ứng được với class cha: đó là phải ăn mới sống được. Nghĩa là khi thiết kế object ta cần quan tâm đến tính chất cần sử dụng của class.
  • Interface Segregation Principle: Thay vì dùng một interface lớn thì tách thành nhiều interface nhỏ, với mục đích cụ thể. (Nếu nguyên tắc đầu tiên được áp dụng tốt, nguyên tắc này cũng sẽ tốt theo)
  • Dependency inversion principle: các module cấp cao ko nên phụ thuộc vào module cấp thấp, cả hai nên phụ thuộc vào abtraction / interface. Interface ko nên phụ thuộc vào chi tiết, mà ngược lại chi tiết nên phụ thuộc vào interface.

SOLID please !