So sánh lớp trừu tượng và interface java

So sánh lớp trừu tượng và interface java

Đã đăng vào thg 11 23, 2020 5:20 SA 2 phút đọc

1. Abstract class là gì?

  • Lớp trừu tượng(abstract class) đơn giản được xem như một class cha cho tất cả class có cùng bản chất.
  • Mỗi lớp con chỉ có thể kế thừa trực tiếp từ một lớp cha bằng từ khóa extends.
  • Không thể khởi tạo được các đối tượng thuộc lớp abstract.
  • Các phương thức trong abstract class có thể là phương thức abstract hoặc không. Nếu là phương thức abstract thì chỉ được khai báo tên nhưng không viết phần nội dung.
  • Lớp con kế thừa từ lớp abstract phải override các phương thức abstract trong đó.

Ví dụ:

name = $name;
  }
  abstract public function intro() : string; 
}
// Child classes
class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!"; 
  }
}
class Volvo extends Car {
  public function intro() : string {
    return "Proud to be Swedish! I'm a $this->name!"; 
  }
}
// Create objects from the child classes
$audi = new audi("Audi");
echo $audi->intro();
echo "
"; $volvo = new volvo("Volvo"); echo $volvo->intro(); echo "
"; ?>

2. Interface là gì?

  • Interface không phải là một class, mà là bản thiết kế cho các class có cùng cách thức hoạt động.
  • Không thể định nghĩa các thuộc tính, khởi tạo đối tượng mà chỉ khai báo các phương thức trong interface.
  • Các phương thức chỉ được khai báo tên nhưng không được viết nội dung trong đó.
  • Các phương thức của interface phải để dưới dạng public.
  • Nếu lớp kế thừa từ interface thì phải override tất cả các phương thức trong đó.
  • Một lớp có thể kế thừa từ nhiều interface khác nhau.

Ví dụ

makeSound();
?>

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

  • Tất cả phương thức trong interface luôn luôn(được hiểu) là abstract.
  • Các phương thức trong abstract class là abstract hoặc không phải là abstract.
  • Có thể implements nhiều interface nhưng không thể extends trực tiếp nhiều class.
  • Các phương thức trong interface luôn luôn phải để là public, khác với abstract class có thể là public, private hoặc protected.

Sự giống nhau giữa interface và abstract class

  • Không thể tạo một biến kiểu interface hoặc abstract class.
  • Nếu là phương thức abstract thì phải được khai báo lại trong class con.
  • Cả interface và abstract class đều có tính kế thừa.

Khi nào thì sử dụng interface, khi nào sử dụng abstract class

  • Khi một nhóm đối tượng có cùng bản chất kế thừa từ một class thì sử dụng abstract class.
  • Khi một nhóm đối tượng không có cùng bản chất nhưng chúng có hành động giống nhau thì sử dụng interface.

All rights reserved

Nói về chủ đề này thì đã có quá nhiều bài viết trên mạng, thế nhưng mục đích mình bài này là để cho những đứa em của mình cũng đang theo con đường lập trình có một nơi để tham khảo. Rất hy vọng được các bạn góp ý để kiến thức mình chia sẽ được tốt hơn.

So sánh lớp trừu tượng và interface java

Thật ra thì với các bạn sinh viên mới ra trường đi làm (con đang là Internship hay Fresher) thì câu hỏi này là top những câu hỏi gặp phải khi phỏng vấn đó nha.

So sánh lớp trừu tượng và interface java

Bên cạnh đó, hiểu rõ sự khác nhau giữa Interface và Abstract Class sẽ giúp chúng ta có thể thiết kế được các ứng dụng mà nó có các kết nối lỏng lẽo (loosely coupled) và dễ dàng mở rộng. Vấn đề này bạn sẽ hiểu rõ hơn trong bài viết nói về Dependency Injection Principle. Một điều quan trọng là bạn không thể chọn dùng Interface hay Abstract Class nếu chỉ biết chúng khác nhau thế nào.

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ác abstract methods của Abstract Class đó.
  • Trong Abstract Class thì các abstract method chỉ có khai báo. Còn virtual method thì có thể được định nghĩa.
  • Abstract Class có thể dùng các access modifiers như: private, protected, internal. Nhưng các abstract/virtual methods thì 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");  
            }              
        }  
    }      
}

Những điểm khác nhau giữa Interface và Abstract Class

Interface Abstract Class Constructors, Fields and Constants Không Có Multiple inheritance Một class có thể hiện thực nhiều interface.(tạm coi là thừa kế) Không hỗ trợ đa thừa kế Default implementation Không thể định nghĩa code xử lý, chỉ có thể khai báo. Có thể định nghĩa thân phương thức, property. Access Modifiers Mọi phương thức, property đều mặc định là public. Có thể xác định modifier. Adding functionality Mọi phương thức, property của interface cần được hiện thực trong class. Không cần thiết.

Khi nào nên dùng Interface

  • Cần cung cấp các chức năng chung cho các lớp không liên quan.
  • Cần nhóm các đối tượng dựa trên các hành vi phổ biến.
  • Cần sử dụng đa hình vì một lớp có thể thực hiện nhiều interfaces.
  • Cần tạo các thành phần (components) được ghép lỏng lẻo, dễ bảo trì và dùng như 1 plugin vì việc implement cho interface được tách biệt với nó.

Khi nào nên dùng Abstract Class

  • Cần sử dụng kế thừa.
  • Cần cung cấp các phương thức mặc định cũng như các phương thức phổ biến mà nhiều lớp dẫn xuất có thể thực thi và ghi đè.
  • Cần tạo nhiều phiên bản cho các thành phần (components). Bạn có thể thêm các thuộc tính và phương thức vào Abstract Class mà không vi phạm mã và tất cả các lớp kế thừa được tự động cập nhật với thay đổi.

Một vấn đề khác là các Interfaces có thể được implement ngầm hoặc rõ ràng (implemented implicitly or explicitly).

À, còn một vấn đề nữa. Như các bạn thấy một Class có thể implement một hoặc nhiều interfaces. Vậy nếu một class implement 2 interfaces mà trong đó có cùng 1 phương thức (method) thì sẽ thế nào?

Thử mở Visual Studio và chạy console app sau xem như thế nào nhé:

using System;
namespace ConsoleApp1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            SampleClass sc = new SampleClass();  
            IControl ctrl = new SampleClass();  
            ISurface srfc = new SampleClass();
            sc.Paint();  
            ctrl.Paint();  
            srfc.Paint();  
        }
        interface IControl  
        {  
            void Paint();  
        }  
        interface ISurface  
        {  
            void Paint();  
        }  
        class SampleClass : IControl, ISurface  
        {  
            public void Paint()  
            {  
                Console.WriteLine("Paint method in SampleClass");  
                Console.ReadKey();  
            }  
            void IControl.Paint()  
            {  
                Console.WriteLine("Paint method in IControl");  
                Console.ReadKey();  
            }
            void ISurface.Paint()  
            {  
                Console.WriteLine("Paint method in ISurface");  
                Console.ReadKey();  
            }  
        }  
    }  
}

Hy vọng bài viết này sẽ giúp bạn hiểu rõ hơn về Interface và Abstract Class. Từ đó giúp bạn xây dựng ứng dụng tốt hơn.