Sự khác nhau giữa abstract và interface trong c#

Khác nhau giữa abstract class và interface khi nào dùng chúng

Nhắc đến Interfaceabstract class hãy nhớ 2 từ này khá clear rồi, Khi sử dụng Interface là bạn Implement còn sử dụng abstract class là bạn extend

  • Interface:
    • Không phải là class.
    • Chỉ chứa những method/properties trống không có thực thi.
    • Nó giống như một khuôn mẫu, một khung để để các lớp implement và follow.
    • Các lớp có thể implements nhiều interface.
    • Là một contract, các class implement phải triển khai các method theo như interface đã định nghĩa.
  • Abstract class:
    • Khá giống Interface nhưng nó có thể làm nhiều việc hơn.
    • Có 2 loại method là abstract method và method thường:
      • abstract method là method trống không có thực thi.
      • method thường là method có thực thi.
    • Các lớp chỉ có thể kế thừa một Abstract class
    • Hướng đến tính năng và những tính năng có thực thi được sử dụng làm hàm chung cho các class extend.

Đi vào ví dụ bằng code cho từng loại nhé: Interface

Tạo 2 interface IAnimal,Interface2 và 2 class Pig,Bird kế thừa 2 interface

namespace oop { interface IAnimal { void Speak(); void Eat(); int X { get; set; } } } namespace oop { interface Interface2 { int Method1(); } } using System; namespace oop { class Pig : IAnimal,Interface2 { public void Eat() { Console.WriteLine("Lợn ăn cám..."); } public void Speak() { Console.WriteLine("Lợn kêu ec ec..."); } public int X { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public int Method1() { throw new NotImplementedException(); } } } using System; namespace oop { class Bird : IAnimal, Interface2 { public void Eat() { Console.WriteLine("Chim ăn sâu..."); } public void Speak() { Console.WriteLine("Chim hót chip chip..."); } public int X { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public int Method1() { throw new NotImplementedException(); } } } using System; namespace oop { class Program { static void Main(string[] args) { Pig p = new Pig(); Bird b = new Bird(); p.Speak(); p.Eat(); b.Speak(); b.Eat(); Console.ReadLine(); } } }

Output:

Kết quả thực thi của class Pig, Bird sau khi implement các method của interface.

Ở demo trên mình tạo ra 2 interface IAnimal và Interface2 tiếp theo là 2 class Pig,Bird implement 2 interface.

  • Rồi đầu tiên bạn thấy điều gì trong interface? tất cả các method đều trống, không xử lý gì hết.
  • Các class Pig, Bird bắt buộc phải implement tất cả các method trong interface
  • Có thể Implement nhiều interface

Abstract class:

Abstract class Animal có 2 method là abstract method(Speak) và method thường(Eat), class Dog và Cat kế thừa lại abstract method

Triển khai code:

using System; namespace oop { abstract class Animal { public abstract void Speak(); public virtual void Eat(string something) { Console.WriteLine("Eat " + something); } } } using System; namespace oop { class Dog : Animal { public override void Speak() { Console.WriteLine("Dog speaks go go"); } } } using System; namespace oop { class Cat : Animal { public override void Speak() { Console.WriteLine("Cat speaks meo meo"); } } }

Output:

Như demo trên mình tạo abstract class Animal gồm 2 method, một abstract method và một method thường có thực thi. Có thể thấy là class Dog, Cat chỉ có thể extend một abstract class, và chỉ phải implement những abstract method còn những method thường không implement vẫn có thể sử dụng, ở trên mình viết method Eat() với từ khóa virtual nên class Dog, Cat có thể override lại.

Sau 2 demo trên các bạn rút ra được ưu điểm, nhược điểm, hay khi nào dùng interface hoặc abstract class không @@. Mình thấy thế này :

  • Ưu điểm:
    • Interface
      • Có thể kế thừa nhiều interface(tính đa hình).
      • Xây dựng được bộ khung mẫu mà các lớp phải follow theo.
      • Giúp quản lý tốt, nắm bắt được các chức năng phải có cho một đối tượng nào đó.
    • Abstract class
      • Có thể linh động các method. giống như một class thông thường.
      • Các class extend có thể override hoặc không override các method thường.
  • Nhược điểm:
    • Interface:
      • Mỗi khi định nghĩa thêm tính năng, các class impelement nó đồng lọat phải thêm tính năng đó, khả năng cao sẽ không có xử lý gì.
    • Abstract class
      • Không thể extend nhiều abstract class.
  • Khi nào sử dụng chúng:
    • Interface : Khi bạn muốn tạo dựng một bộ khung chuẩn gồm các chức năng mà những module hay project cần phải có. Giống như sau khi nhận requirement của khách hàng về team ngồi với nhau và phân tích các đầu mục các tính năng của từng module, sau đó triển khai vào code viết các interface như đã phân tích,để các bạn dev có thể nhìn vào đó để thực hiện đủ các tính năng (khi đã implement rồi thì không sót một tính năng nào ^^).
    • Abstract class: Giống như demo trên bạn có thể hiểu khi định nghĩa một đối tượng có những chức năng A,B,C trong đó tính năng A,B chắc chắn sẽ thực thi theo cách nào đó, còn tính năng C phải tùy thuộc vào đối tượng cụ thể là gì, như đối tượng Dog, Cat tuy chúng đều có thể phát ra âm thanh nhưng âm thanh là khác nhau. Vì vậy method Speak() là abstract method để chỉ ra rằng tính năng này còn dang dở chưa rõ thực thi, các lớp extend phải hoàn thành nốt tính năng này, còn những tính năng đã hoàn thành vẫn sử dụng như bình thường đây là những tính năng chung.

Xong rồi haiz hơi rối @@ bạn đọc xong cho mình ý kiến nhé. thank you 😄

=> Lý thuyết thì một phần căn bản phải practice và practice nhiều @@

Các bạn có thể tham khảo thêm ở đây nhé:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstractt


So sánh Interface và Abstract trong lập trình hướng đối tượng.

Sự khác nhau giữa Abstract class và Interface

Abstract class và interface đều được sử dụng để có được sự trừu tượng mà ở đó chúng ta có thể khai báo các phương thức trừu tượng. Nhưng có một vài sự khác nhau giữa abstract class và interface được liệt kê trong bảng sau:

Abstract classInterface
1) Abstract class có phương thức abstract (không có thân hàm) và phương thức non-abstract (có thân hàm).Interface chỉ có phương thức abstract. Từ java 8, nó có thêm các phương thức default và static.
2) Abstract class không hỗ trợ đa kế thừa.Interface có hỗ trợ đa kế thừa
3) Abstract class có các biến final, non-final, static and non-static.Interface chỉ có các biến static và final.
4) Abstract class có thể cung cấp nội dung cài đặt cho phương thức của interface.Interface không thể cung cấp nội dung cài đặt cho phương thức của abstract class.
5) Từ khóa abstract được sử dụng để khai báo abstract class.Từ khóa interface được sử dụng để khai báo interface.
6) Ví dụ:
public abstract class Shape {
public abstract void draw();
}
Ví dụ:
public interface Drawable {
void draw();
}

Đơn giản để hiểu, đó là abstract class có được trừu tượng 1 phần (0 tới 100%), còn interface có được trừu tường toàn phần (100%).


Interface trong C#

Có thể hiểu đơn giản Interface là một bản thiết kế cho bất kì class muốn thực hiện nó. Nghĩa là nó chỉ có phần khai báo các phương thức/sự kiện và thuộc tính. Các class muốn thực hiện Interface này sẽ viết code implement cho tất cả các khai báo của Interface này.

Các tính chất của Interface

  • Interface không cung cấp việc kế thừa như Class hay Abstract Class mà nó chỉ khai báo phương thức/sự kiện để các lớp khác thực hiện nó.
  • Nó không được khởi tạo nhưng nó có thể được tham chiếu bởi đối tượng của lớp thực hiện nó. ví dụ:
IUserRepository user = new UserRepository();
  • Không có interface lồng nhau (nested interface)
  • Không có constructor, destructor, constants, static và variable.
  • Một interface có thể kế thừa từ một hoặc nhiều interface khác.
public interface IList : ICollection, IEnumerable, IEnumerable
  • Một interface có thể mở rộng một interface khác.
  • Một class có thể implement một hoặc nhiều interfaces.
  • Mọi phương thức, property đều mặc định là public.

Abstract Class trong C#

Lớp trừu tượng (Abstract Class) là một loại lớp đặc biệt không thể khởi tạo được và nó hoạt động như một lớp cơ sở cho các lớp khác.

Mục đích của Abstract Class là cung cấp các chức năng cơ bản mặc định hoặc các chức năng chung chung mà các lớp dẫn suất có thể thực hiện và ghi đè. Nghĩa là, bạn có thể viết định nghĩa cho phương thức trong Abstract Class, các phương thức trong Abstract Class có thể vừa trừu tượng vừa cụ thể.

Các tính chất của Abstract Class

  • Một Abstract Class không thể được khởi tạo.
  • Abstract Class có thể chứa các phương thức trừu tượng và cụ thể (abstract method – virtual method).
  • Một Abstract Class không thể là một Sealed Class. Vì Sealed Class không cho phép kế thừa.
  • Không thể kế thừa từ một Class hay Interface.
  • Lớp dẫn xuất từ Abstract Class phải implement tất cả cácabstract methodscủa Abstract Class đó.
  • Trong Abstract Class thì cácabstract methodchỉ có khai báo. Cònvirtual methodthì có thể được định nghĩa.
  • Abstract Class có thể dùng các access modifiers như: private, protected, internal. Nhưng cácabstract/virtual methodsthì không thể dùng private.
  • Abstract Class có thể có contructor, destructor, constants, fields
  • Không hỗ trợ đa kế thừa.
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { SampleClass sc = new SampleClass(); //AbsSimpleClass absSimpleClass = new AbsSimpleClass(); // Error here sc.Paint(); Console.ReadKey(); //Output: //--> AbsSimpleClass constructor here //--> Paint method here } public abstract class AbsSimpleClass { public AbsSimpleClass() { Console.WriteLine("AbsSimpleClass constructor here"); } public abstract void DoSomething(); public virtual void Paint() { Console.WriteLine("Paint method here"); } } public class SampleClass : AbsSimpleClass { public override void DoSomething() { Console.WriteLine("Do something here"); } } } }

Abstract class và Interface

Lớp (Class) trong lập trình hướng đối tượng là một khuôn mẫu hoặc một bản thiết kế, mô hình mô phỏng các đối tượng.

Đối tượng là các thể hiện của lớp, một đối tượng là một sự tượng trưng cho một thực thể, hoặc là thực thể tồn tại trong thế giới đời thực hoặc thực thể mang tính khái niệm. Một đối tượng có thể tượng trưng cho cái gì đó cụ thể.

Ví dụ: một chiếc Mercedes Benz là một đối tượng thuộc lớp Car, một chiếc IphoneX là đối tượng thuộc lớp Mobile,…

Các ngôn ngữ hướng đối tượng như Java, C#,… hỗ trợ khái niệm kế thừa. Kế thừa có nghĩa là một đối tượng có thể được thừa kế các hành vi và phương thức của lớp. Bất cứ khi nào bạn tạo đối tượng mới của một lớp, bạn nói rằng bạn đang khởi tạo nó.

Đối với Abstract class

Abstract class giống như 1 type, tức là 1 kiểu chúng cho các class dẫn xuất, các class dẫn xuất thuộc về 1 kiểu đó, nó sẽ cung cấp các thuộc tính và hành vi chung nhất cho kiểu đó.

Ví dụ:

abstract class Person { protected string _name; protected DateTime _birthDate; protected void Say() { Console.Write("Person is saying...."); } protected abstract void Work(); } class Employee : Person { private float _salary; protected override void Work() { throw new NotImplementedException(); } } class Student : Person { private float _mark; protected override void Work() { throw new NotImplementedException(); } }

Chúng ta có abstract class Person chứa các thông tin chung cho người như tên hay ngày sinh nhật. Còn lại các class dẫn xuất như Employee hay Student sẽ có các tính chất riêng của nó thì khai báo thêm. Còn những gì có thể dùng chung sẽ được khai báo trong Person, như vậy sẽ giảm thiểu trùng lặp code, và dễ bảo trì hơn.

Vậy chúng ta hiểu rằng mối quan hệ giữa Abstract class và derived class là mối quan hệ is-a tức là mối quan hệ thuộc về tập cha con. Nên một con chỉ thuộc về 1 cha thôi, trong đó cha quy định các gen di truyền chung nhất cho các con, các con có quyền bổ sung thêm, có quyền thể hiện hoặc không thể hiện một đặc tính hay 1 hành động của cha.

Đối với Interface

Khác với Abstract class giống một bản thiết kế của toàn class thì interface chỉ là bản thiết kế của các chi tiết method. Mối quan hệ giữa lớp thực thi và interface là mối quan hệ can-do vì đơn thuần, class triển khai interface nó phải triển khai toàn bộ method của interface đã định nghĩa. Vậy là class đó có thể làm những gì interface quy định.

Như vậy hoàn toàn 1 class có thể can-do nhiều method ở nhiều interface khác nhau, ví dụ:

interface IRunable { void Run(); } interface IWorkable { void Work(); } interface IEatable { void Eat(); } class Person : IRunable,IWorkable, IEatable { protected string _name; protected DateTime _birthDate; public void Run() { Console.Write("Person runing..."); } public void Work() { Console.Write("Person working..."); } public void Eat() { Console.Write("Person eating..."); } }

Chúng ta thấy cùng là con người nhưng có thể can-do tức là có thể thực hiện nhiều hành động, các interface chỉ định nghĩa tên các hành động, để các class implement triển khai chi tiết, tức triển khai interface nào có thể can-do được các hành động của interface đó.

Vậy sự khác nhau chính giữa abstract class và interface ở đây chính là mối quan hệ giữa class dẫn xuất và chúng. Đồng thời khác nhau ở mục đích sử dụng của chúng.


Trích nguồn từ: (TEDU)