Lớp và phương thức trong C# (Bài 4)

Mở đầu bài học lớp và phương thức trong c# sẽ trình bày tổng quan về lập trình hướng đối tượng (Object-Oriented Programming). Như chúng ta đã biết ngôn ngữ lập trình dựa trên hai khái niệm cơ bản là dữ liệu và cách thức để thao tác dữ liệu. Ngôn ngữ lập trình truyền thống như C tập trung vào cách thao tác dữ liệu hơn là dữ liệu và điều này có một vài nhược điểm như khả năng tái sử dụng và khả năng bảo trì bị hạn chế.

Để khắc phục những khó khăn trên, ngôn ngữ lập trình hướng đối tượng được giới thiệu, trong đó tập trung vào dữ liệu chứ không phải là cách thao tác dữ liệu.Trong lập trình hướng đối tượng sẽ định nghĩa các đối tượng bao gồm thuộc tính (data) và phương thức (thao tác với dữ liệu).

Lớp và phương thức trong c# – Đặc điểm

Bảng sau đây trình bày những đặc điểm của lập trình hướng đối tượng

Abstraction (Trừu tượng)  Trừu tượng là một tính năng giúp hiển thị các thông tin cần thiết từ đối tượng.
Encapsulation (Đóng gói) Những khai báo trong một lớp có thể bị ẩn ở lớp khác và chỉ có những thông tin cụ thể có thể được sử dụng.
Inheritance (Kế thừa) Thừa kế là quá trình của việc tạo ra một lớp mới dựa trên các thuộc tính và phương thức của một lớp học hiện có. Các lớp học hiện có được gọi là lớp cơ sở trong khi lớp mới tạo ra được gọi là lớp dẫn xuất.
 Polymorphism (Đa hình) Đa hình là khả năng ứng xử khác nhau trong các tình huống khác nhau.

Lớp và phương thức trong c# – Lớp và đối tượng

Lớp là khuôn mẫu để tạo ra đối tượng. Một đối tượng là một thể hiện của lớp và bên trong nó là những thuộc tính, biến hoặc hành vi (hay còn gọi là phương thức).

Ví dụ một chiếc xe Exciter, một chiếc xe Airblade, một chiếc xe Attila có thể được nhóm lại với nhau thành lớp Motorbike.

Tạo lớp trong Microsoft Visual Studio

Chuột phải vào project  (hoặc namespace) -> chọn Add -> chọn Class -> Nhập Motorbike tại Name -> chọn Add

lop va phuong thuc trong c# 1

Kết quả sau khi tạo lớp Motorbike

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication.lesson03
{
 class Motorbike
 {
 }
}

Tạo đối tượng (Instantiating Objects)

Sử dụng cú pháp sau để tạo đối tượng

// ClassName là tên lớp, objectName là tên đối tượng 
ClassName objectName = new ClassName();

Ví dụ tạo đối tượng là exciter sử dụng lớp Motorbike

Motorbike exciter = new Motorbike();

Lớp và phương thức trong c# – Thuộc tính

Thuộc tính là những thông tin cần được lưu trữ của đối tượng. Ví dụ đối tượng sinh viên cần lưu trữ các thông tin về mã sinh viên, tên sinh viên, giới tính, … Đây chính là thuộc tính trong lập trình hướng đối tượng nói chung và trong C# nói riêng.

Khai báo thuộc tính trong C#

accessModifier dataType attributeName;

Access Modifiers cho phép các lập trình viên chỉ định quyền truy cập của các lớp khác vào các thuộc tính. Bảng bên dưới trình bày các quyền truy cập hiện có trong C#

public Truy cập không hạn chế.
protected Giới hạn truy cập. Có thể được truy cập bên trong một lớp hoặc những lớp con.
internal Truy cập bị giới hạn bên trong assembly.
private Giới hạn truy cập bên trong lớp khai báo.

Data type là kiểu dữ liệu đã được chúng tôi trình bày trong bài học Giới thiệu ngôn ngữ lập trình C#

Ví dụ khai báo thuộc tính trong C#

// Tên sinh viên
private string studentName;
// Địa chỉ
private string studentAddress;
// Giới tính
private string studentGender;

Lớp và phương thức trong c# – Phương thức

Nếu như thuộc tính là đặc điểm của đối tượng và chứa thông tin của đối tượng thì phương thức là những xử lý chẳng hạn như xử lý hiển thị thông tin sinh viên, xử lý tìm kiếm sinh viên theo mã số, …

Khai báo phương thức trong C#

accessModifier datatype|void methodName([list of parameters]){ 
  // Xử lý của phương thức 
}

Ví dụ khai báo phương thức trong C#

public void Display(){ 
  Console.Write("Name of student: " + name);
  Console.Write("Address of student: " + address);
  Console.Write("Gender of student: " + gender);
}

Lớp và phương thức trong c# – Ví dụ mẫu

Tạo lớp Motorbike

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication.lesson03
{
 class Motorbike
 {
  // Khai báo thuộc tính
  private string name;
  private string type;
  private string color;
  private int guarantee;

  // Khai báo và định nghĩa phương thức
  public void Input()
  {
   Console.Write("Enter motorbike name: ");
   name = Console.ReadLine();

   Console.Write("Enter motorbike type: ");
   type = Console.ReadLine();
 
   Console.Write("Enter motorbike color: ");
   color = Console.ReadLine();

   Console.Write("Enter motorbike guarantee: ");
   guarantee = Convert.ToInt32(Console.ReadLine());
  }

  public void Display()
  {
   Console.WriteLine("Motorbike name: " + name);
   Console.WriteLine("Motorbike color: " + color);
   Console.WriteLine("Motorbike type: " + type);
   Console.WriteLine("Motorbike guarantee: " + guarantee);
  }
 }
}

Tạo đối tượng exciter sử dụng lớp Motorbike

// Tạo đối tượng là exciter
Motorbike exciter = new Motorbike();
// Truy cập phương thức
exciter.Input();
exciter.Display();

Lớp và phương thức trong c# – Từ khoá static

Từ khoá static được sử dụng để khai báo lớp (static class), khai báo thuộc tính (static attribute), khai báo phương thức (static method).

Sử dụng static trong khai báo lớp (static class)

Một lớp được khai báo với từ khoá static sẽ không thể tạo đối tượng và không cho kế thừa. Mục đích của việc sử dụng từ khoá static trong khai báo lớp là lớp này chỉ chứa các thành viên static (thuộc tính và phương thức).

Ví dụ tạo lớp static

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication.lesson03
{
 static class Product
 {
  // Thuộc tính static
  public static int productId;
  public static float productPrice;
  // Phương thức static
  public static void Display()
  {
   Console.WriteLine("Product id: " + productId);
   Console.WriteLine("Product price: " + productPrice);
  }
 }
}

Ví dụ sử dụng lớp static

// Truy cập các thuộc tính sử dụng tên lớp
Product.productId = 1;
Product.productPrice = 72.5F;
// Truy cập phương thức sử dụng tên lớp
Product.Display();

Lưu ý

Thuộc tính, phương thức được khai báo với từ khoá static sẽ được truy cập sử dụng tên lớp thay vì sử dụng tên đối tượng.

Trong một lớp, một biến được khai báo là static sẽ được sử dụng chung cho tất cả các đối tượng của lớp. Vi vậy một sự thay đổi của biến sẽ ảnh hưởng đến tất cả các đối tượng. Như vậy static không nên sử dụng để khai báo thuộc tính.

Lớp và phương thức trong c# – Phương thức nạp chồng (overloading method)

Trong một lớp không thể chứa 2 phương thức cùng tên, cùng danh sách tham số (kiểu dữ liệu và số lượng tham số) nhưng lập trình viên có thể khai báo nhiều phương thức cùng tên nhưng khác nhau về danh sách tham số (khác kiểu dữ liệu, số lượng tham số). Và phương pháp này được gọi là Overloading method. Đây chính là đặc điểm của tính đa hình trong lập trình hướng đối tượng.

Ví dụ khai báo và viết xử lý cho 2 phương thức không hợp lệ trong C#

lop va phuong thuc trong c# 2

Ví dụ khai báo và viết xử lý cho 2 phương thức hợp lệ trong C#

// Tính tổng 2 số thực
internal float Addition(float n1, float n2)
{
 return n1 + n2;
}
// Tính tổng 3 số thực
internal float Addition(float n1, float n2, float n3)
{
 return n1 + n2 + n3;
}

Lớp và phương thức trong c# – Đối số được truyền theo tham chiếu

Chúng ta có thể sử dụng từ khoá out hoặc ref để thực hiện truyền đối số theo tham chiếu nghĩa là những thay đổi cho đối số sẽ bị ảnh hưởng sau khi kết thúc phương thức.

Điểm khác biệt duy nhất giữa out và ref là ref yêu cầu biến phải được khởi tạo trước khi được truyền vào phương thức.

Ví dụ về out và ref trong C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication.lesson04
{
 class OutAndRefExample
 {
  // Sử dụng từ khoá out
  internal void Init(out int value)
  {
   value = 10;
  }
  // Sử dụng từ khoá ref
  internal void Swap(ref int val1, ref int val2)
  {
    int tmp;
    tmp = val1;
    val1 = val2;
    val2 = tmp;
  }
 }
}

Gọi phương thức và truyền tham số

OutAndRefExample oare = new OutAndRefExample();
// Truyền tham số với từ khoá out
int n;
oare.Init(out n);
Console.WriteLine("n = " + n);
// Truyền tham số với từ khoá ref
int a = 1, b = 2;
oare.Swap(ref a, ref b);
Console.WriteLine("a = {0}, b = {1}", a, b);

Lớp và phương thức trong c# – Từ khoá this

Tương tự như lập trình Java, từ khoá this được sử dụng thể tham khảo đến đối tượng hiện hành của lớp để giải quyết sự xung đột giữa các biến hoặc thuộc tính cùng tên khi thực hiện truyền đối số của phương thức

Ví dụ sử dụng từ khoá this

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication.lesson04
{
 class Motorbike
 {
  // Khai báo thuộc tính
  private string name;
  private string type;
  private string color;
  private int guarantee;

  public Motorbike(string name, string type, string color, int guarantee)
  {
   this.name = name;
   this.type = type;
   this.color = color;
   this.guarantee = guarantee;
  }

  // Khai báo và định nghĩa phương thức
  public void Input()
  {
   Console.Write("Enter motorbike name: ");
   name = Console.ReadLine();

   Console.Write("Enter motorbike type: ");
   type = Console.ReadLine();
 
   Console.Write("Enter motorbike color: ");
   color = Console.ReadLine();

   Console.Write("Enter motorbike guarantee: ");
   guarantee = Convert.ToInt32(Console.ReadLine());
  }

  public void Display()
  {
   Console.WriteLine("Motorbike name: " + name);
   Console.WriteLine("Motorbike color: " + color);
   Console.WriteLine("Motorbike type: " + type);
   Console.WriteLine("Motorbike guarantee: " + guarantee);
  }
 }
}

Lớp và phương thức trong c# – Bài tập thực hành

Giả sử bạn là một thành viên trong nhóm lập trình và được giao nhiệm vụ viết chương trình với yêu cầu cụ thể sau đây:

a) Tạo lớp Medicine được sử dụng để lưu trữ các thông tin sau

  1. Medicine Code
  2. Medicine Name
  3. Manufacturer Name
  4. Unit Price
  5. Quantity On Hand
  6.  Manufactured Date
  7. Expiry Date
  8. Batch Number

b) Tạo lớp Sales được sử dụng để lưu trữ các thông tin sau

  1. Medicine Code
  2. Quantity Sold
  3. Planned Sales
  4. Actual Sales
  5. Region

c) Mỗi lớp sử dụng phương thức khởi tạo để khởi tạo dữ liệu

b) Phương thức Accept() trong mỗi lớp được sử dụng để nhập và lưu dữ liệu cho các thuộc tính.

d) Phương thức Print() trong lớp Medicine được sử dụng để hiển thị thông tin của tất cả các thuộc tính.

e) Phương thức Display() trong lớp Sales để hiển thị tất cả thông tin của các thuộc tính trong lớp này. Một phương thức khác cùng tên được sử dụng để hiển thị thông tin của các thuộc tính theo Medicine Code.

f) Tạo lớp Test cài đặt phương thức Main() và cho phép người dùng tạo và hiển thị Medicine, Sales.