Interface và Abstract class

Công Nghệ
Interface và Abstract class
Bài viết được sự cho phép của tác giả Tino Phạm 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. 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. Cơ bản về Class trong C++ Factory Function vs. Class 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...

Bài viết được sự cho phép của tác giả Tino Phạm

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.

Interface và Abstract classInterface và Abstract class

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.

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<T> : ICollection<T>, IEnumerable<T>, 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
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.

Mình cũng rất mong được các bạn góp ý để bổ sung và hoàn chỉnh kiến thức này.

Tham khảo thêm:

  1. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation
  2. https://www.infoworld.com/article/2928719/c-sharp/when-to-use-an-abstract-class-vs-interface-in-c.html
  3. https://www.dotnettricks.com/learn/csharp/a-deep-dive-into-csharp-interface
  4. https://www.dotnettricks.com/learn/csharp/a-deep-dive-into-csharp-abstract-class

Bài viết gốc được đăng tải tại thangphampt.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên Station D

Bài viết liên quan

Bộ cài đặt Laravel Installer đã hỗ trợ tích hợp Jetstream

Bộ cài đặt Laravel Installer đã hỗ trợ tích hợp Jetstream

Bài viết được sự cho phép của tác giả Chung Nguyễn Hôm nay, nhóm Laravel đã phát hành một phiên bản chính mới của “ laravel/installer ” bao gồm hỗ trợ khởi động nhanh các dự án Jetstream. Với phiên bản mới này khi bạn chạy laravel new project-name , bạn sẽ nhận được các tùy chọn Jetstream. Ví dụ: API Authentication trong Laravel-Vue SPA sử dụng Jwt-auth Cách sử dụng Laravel với Socket.IO laravel new foo --jet --dev Sau đó, nó sẽ hỏi bạn thích stack Jetstream nào hơn: Which Jetstream stack do you prefer? [0] Livewire [1] inertia > livewire Will your application use teams? (yes/no) [no]: ... Nếu bạn đã cài bộ Laravel Installer, để nâng cấp lên phiên bản mới bạn chạy lệnh: composer global update Một số trường hợp cập nhật bị thất bại, bạn hãy thử, gỡ đi và cài đặt lại nha composer global remove laravel/installer composer global require laravel/installer Bài viết gốc được đăng tải tại chungnguyen.xyz Có thể bạn quan tâm: Cài đặt Laravel Làm thế nào để chạy Sql Server Installation Center sau khi đã cài đặt xong Sql Server? Quản lý các Laravel route gọn hơn và dễ dàng hơn Xem thêm Tuyển dụng lập trình Laravel hấp dẫn trên Station D

By stationd
Principle thiết kế của các sản phẩm nổi tiếng

Principle thiết kế của các sản phẩm nổi tiếng

Tác giả: Lưu Bình An Phù hợp cho các bạn thiết kế nào ko muốn làm code dạo, design dạo nữa, bạn muốn cái gì đó cao hơn ở tầng khái niệm Nếu lập trình chúng ta có các nguyên tắc chung khi viết code như KISS , DRY , thì trong thiết kế cũng có những nguyên tắc chính khi làm việc. Những nguyên tắc này sẽ là kim chỉ nam, nếu có tranh cãi giữa các member trong team, thì cứ đè nguyên tắc này ra mà giải quyết (nghe hơi có mùi cứng nhắc, mình thì thích tùy cơ ứng biến hơn) Tìm các vị trí tuyển dụng designer lương cao cho bạn Nguyên tắc thiết kế của GOV.UK Đây là danh sách của trang GOV.UK Bắt đầu với thứ user cần Làm ít hơn Thiết kế với dữ liệu Làm mọi thứ thật dễ dàng Lặp. Rồi lặp lại lần nữa Dành cho tất cả mọi người Hiểu ngữ cảnh hiện tại Làm dịch vụ digital, không phải làm website Nhất quán, nhưng không hòa tan (phải có chất riêng với thằng khác) Cởi mở, mọi thứ tốt hơn Bao trừu tượng luôn các bạn, trang Gov.uk này cũng có câu tổng quát rất hay Thiết kế tốt là thiết kế có thể sử dụng. Phục vụ cho nhiều đối tượng sử dụng, dễ đọc nhất nhất có thể. Nếu phải từ bỏ đẹp tinh tế – thì cứ bỏ luôn . Chúng ta tạo sản phẩm cho nhu cầu sử dụng, không phải cho người hâm mộ . Chúng ta thiết kế để cả nước sử dụng, không phải những người đã từng sử dụng web. Những người cần dịch vụ của chúng ta nhất là những người đang cảm thấy khó sử dụng dịch...

By stationd
Hiểu về trình duyệt – How browsers work

Hiểu về trình duyệt – How browsers work

Bài viết được sự cho phép của vntesters.com Khi nhìn từ bên ngoài, trình duyệt web giống như một ứng dụng hiển thị những thông tin và tài nguyên từ server lên màn hình người sử dụng, nhưng để làm được công việc hiển thị đó đòi hỏi trình duyệt phải xử lý rất nhiều thông tin và nhiều tầng phía bên dưới. Việc chúng ta (Developers, Testers) tìm hiểu càng sâu tầng bên dưới để nắm được nguyên tắc hoạt động và xử lý của trình duyệt sẽ rất hữu ích trong công việc viết code, sử dụng các tài nguyên cũng như kiểm thử ứng dụng của mình. Cách để npm packages chạy trong browser Câu hỏi phỏng vấn mẹo về React: Component hay element được render trong browser? Khi hiểu được cách thức hoạt động của trình duyệt chúng ta có thể trả lời được rất nhiều câu hỏi như: Tại sao cùng một trang web lại hiển thị khác nhau trên hai trình duyệt? Tại sao chức năng này đang chạy tốt trên trình duyệt Firefox nhưng qua trình duyệt khác lại bị lỗi? Làm sao để trang web hiển thị nội dung nhanh và tối ưu hơn một chút?… Hy vọng sau bài này sẽ giúp các bạn có một cái nhìn rõ hơn cũng như giúp ích được trong công việc hiện tại. 1. Cấu trúc của một trình duyệt Trước tiên chúng ta đi qua cấu trúc, thành phần chung và cơ bản nhất của một trình duyệt web hiện đại, nó sẽ gồm các thành phần (tầng) như sau: Thành phần nằm phía trên là những thành phần gần với tương tác của người dùng, càng phía dưới thì càng sâu và nặng về xử lý dữ liệu hơn tương tác. Nhiệm...

By stationd
Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Lĩnh vực EdTech (ứng dụng công nghệ vào các sản phẩm giáo dục) trên toàn cầu hiện nay đã tương đối phong phú với nhiều tên tuổi lớn phân phối đều trên các hạng mục như Broad Online Learning Platforms (nền tảng cung cấp khóa học online đại chúng – tiêu biểu như Coursera, Udemy, KhanAcademy,…) Learning Management Systems (hệ thống quản lý lớp học – tiêu biểu như Schoology, Edmodo, ClassDojo,…) Next-Gen Study Tools (công cụ hỗ trợ học tập – tiểu biểu như Kahoot!, Lumosity, Curriculet,…) Tech Learning (đào tạo công nghệ – tiêu biểu như Udacity, Codecademy, PluralSight,…), Enterprise Learning (đào tạo trong doanh nghiệp – tiêu biểu như Edcast, ExecOnline, Grovo,..),… Hiện nay thị trường EdTech tại Việt Nam đã đón nhận khoảng đầu tư khoảng 55 triệu đô cho lĩnh vực này nhiều đơn vị nước ngoài đang quan tâm mạnh đến thị trường này ngày càng nhiều hơn. Là một trong những xu hướng phát triển tốt, và có doanh nghiệp đã hoạt động khá lâu trong ngành nêu tại infographic như Topica, nhưng EdTech vẫn chỉ đang trong giai đoạn sơ khai tại Việt Nam. Tại Việt Nam, hệ sinh thái EdTech trong nước vẫn còn rất non trẻ và thiếu vắng nhiều tên tuổi trong các hạng mục như Enterprise Learning (mới chỉ có MANA), School Administration (hệ thống quản lý trường học) hay Search (tìm kiếm, so sánh trường và khóa học),… Với chỉ dưới 5% số dân công sở có sử dụng một trong các dịch vụ giáo dục online, EdTech cho thấy vẫn còn một thị trường rộng lớn đang chờ được khai phá. *** Vừa qua Station D đã công bố Báo cáo Vietnam IT Landscape 2019 đem đến cái nhìn toàn cảnh về các ứng dụng công...

By stationd