C # - Các lớp
Khi bạn xác định một lớp, bạn xác định một bản thiết kế cho một kiểu dữ liệu. Điều này thực sự không xác định bất kỳ dữ liệu nào, nhưng nó xác định ý nghĩa của tên lớp. Đó là, một đối tượng của lớp bao gồm những gì và những thao tác nào có thể được thực hiện trên đối tượng đó. Đối tượng là các thể hiện của một lớp. Các phương thức và biến tạo thành một lớp được gọi là thành viên của lớp.
Xác định một lớp
Một định nghĩa lớp bắt đầu với lớp từ khóa theo sau là tên lớp; và phần thân của lớp được bao bởi một cặp dấu ngoặc nhọn. Sau đây là dạng chung của định nghĩa lớp:
<access specifier> class class_name {
// member variables
<access specifier> <data type> variable1;
<access specifier> <data type> variable2;
...
<access specifier> <data type> variableN;
// member methods
<access specifier> <return type> method1(parameter_list) {
// method body
}
<access specifier> <return type> method2(parameter_list) {
// method body
}
...
<access specifier> <return type> methodN(parameter_list) {
// method body
}
}
Lưu ý -
Các chỉ định truy cập chỉ định các quy tắc truy cập cho các thành viên cũng như chính lớp đó. Nếu không được đề cập, thì chỉ định truy cập mặc định cho một loại lớp làinternal. Quyền truy cập mặc định cho các thành viên làprivate.
Kiểu dữ liệu chỉ định kiểu của biến và kiểu trả về chỉ định kiểu dữ liệu của dữ liệu mà phương thức trả về, nếu có.
Để truy cập các thành viên trong lớp, bạn sử dụng toán tử dấu chấm (.).
Toán tử dấu chấm liên kết tên của một đối tượng với tên của một thành viên.
Ví dụ sau minh họa các khái niệm được thảo luận cho đến nay -
using System;
namespace BoxApplication {
class Box {
public double length; // Length of a box
public double breadth; // Breadth of a box
public double height; // Height of a box
}
class Boxtester {
static void Main(string[] args) {
Box Box1 = new Box(); // Declare Box1 of type Box
Box Box2 = new Box(); // Declare Box2 of type Box
double volume = 0.0; // Store the volume of a box here
// box 1 specification
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// box 2 specification
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// volume of box 1
volume = Box1.height * Box1.length * Box1.breadth;
Console.WriteLine("Volume of Box1 : {0}", volume);
// volume of box 2
volume = Box2.height * Box2.length * Box2.breadth;
Console.WriteLine("Volume of Box2 : {0}", volume);
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Volume of Box1 : 210
Volume of Box2 : 1560
Chức năng thành viên và đóng gói
Hàm thành viên của một lớp là một hàm có định nghĩa hoặc nguyên mẫu của nó trong định nghĩa lớp tương tự như bất kỳ biến nào khác. Nó hoạt động trên bất kỳ đối tượng nào của lớp mà nó là thành viên và có quyền truy cập vào tất cả các thành viên của lớp cho đối tượng đó.
Các biến thành viên là các thuộc tính của một đối tượng (theo quan điểm thiết kế) và chúng được giữ kín để thực hiện đóng gói. Các biến này chỉ có thể được truy cập bằng các hàm thành viên công cộng.
Hãy để chúng tôi đưa ra các khái niệm trên để đặt và nhận giá trị của các thành viên lớp khác nhau trong một lớp -
using System;
namespace BoxApplication {
class Box {
private double length; // Length of a box
private double breadth; // Breadth of a box
private double height; // Height of a box
public void setLength( double len ) {
length = len;
}
public void setBreadth( double bre ) {
breadth = bre;
}
public void setHeight( double hei ) {
height = hei;
}
public double getVolume() {
return length * breadth * height;
}
}
class Boxtester {
static void Main(string[] args) {
Box Box1 = new Box(); // Declare Box1 of type Box
Box Box2 = new Box();
double volume;
// Declare Box2 of type Box
// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// volume of box 1
volume = Box1.getVolume();
Console.WriteLine("Volume of Box1 : {0}" ,volume);
// volume of box 2
volume = Box2.getVolume();
Console.WriteLine("Volume of Box2 : {0}", volume);
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Volume of Box1 : 210
Volume of Box2 : 1560
Trình tạo C #
Một lớp học constructor là một hàm thành viên đặc biệt của một lớp được thực thi bất cứ khi nào chúng ta tạo các đối tượng mới của lớp đó.
Một hàm tạo có tên giống hệt như tên của lớp và nó không có bất kỳ kiểu trả về nào. Ví dụ sau giải thích khái niệm về hàm tạo:
using System;
namespace LineApplication {
class Line {
private double length; // Length of a line
public Line() {
Console.WriteLine("Object is being created");
}
public void setLength( double len ) {
length = len;
}
public double getLength() {
return length;
}
static void Main(string[] args) {
Line line = new Line();
// set line length
line.setLength(6.0);
Console.WriteLine("Length of line : {0}", line.getLength());
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Object is being created
Length of line : 6
A default constructorkhông có bất kỳ tham số nào nhưng nếu bạn cần, một phương thức khởi tạo có thể có tham số. Các hàm tạo như vậy được gọi làparameterized constructors. Kỹ thuật này giúp bạn gán giá trị ban đầu cho một đối tượng tại thời điểm tạo ra nó như thể hiện trong ví dụ sau:
using System;
namespace LineApplication {
class Line {
private double length; // Length of a line
public Line(double len) { //Parameterized constructor
Console.WriteLine("Object is being created, length = {0}", len);
length = len;
}
public void setLength( double len ) {
length = len;
}
public double getLength() {
return length;
}
static void Main(string[] args) {
Line line = new Line(10.0);
Console.WriteLine("Length of line : {0}", line.getLength());
// set line length
line.setLength(6.0);
Console.WriteLine("Length of line : {0}", line.getLength());
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Object is being created, length = 10
Length of line : 10
Length of line : 6
Bộ hủy C #
A destructorlà một hàm thành viên đặc biệt của một lớp được thực thi bất cứ khi nào một đối tượng của lớp đó vượt ra khỏi phạm vi. Adestructor có tên chính xác giống với tên của lớp có dấu ngã ở trước (~) và nó không thể trả về giá trị cũng như không thể nhận bất kỳ tham số nào.
Bộ hủy có thể rất hữu ích để giải phóng tài nguyên bộ nhớ trước khi thoát khỏi chương trình. Bộ hủy không thể được kế thừa hoặc quá tải.
Ví dụ sau giải thích khái niệm hàm hủy -
using System;
namespace LineApplication {
class Line {
private double length; // Length of a line
public Line() { // constructor
Console.WriteLine("Object is being created");
}
~Line() { //destructor
Console.WriteLine("Object is being deleted");
}
public void setLength( double len ) {
length = len;
}
public double getLength() {
return length;
}
static void Main(string[] args) {
Line line = new Line();
// set line length
line.setLength(6.0);
Console.WriteLine("Length of line : {0}", line.getLength());
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Object is being created
Length of line : 6
Object is being deleted
Các thành viên tĩnh của một lớp C #
Chúng ta có thể xác định các thành viên lớp là tĩnh bằng cách sử dụng statictừ khóa. Khi chúng ta khai báo một thành viên của một lớp là static, điều đó có nghĩa là cho dù có bao nhiêu đối tượng của lớp được tạo ra thì cũng chỉ có một bản sao của thành viên tĩnh.
Từ khóa staticngụ ý rằng chỉ có một thể hiện của thành viên tồn tại cho một lớp. Biến static được sử dụng để định nghĩa hằng số vì giá trị của chúng có thể được truy xuất bằng cách gọi lớp mà không cần tạo một thể hiện của nó. Các biến static có thể được khởi tạo bên ngoài hàm thành viên hoặc định nghĩa lớp. Bạn cũng có thể khởi tạo các biến tĩnh bên trong định nghĩa lớp.
Ví dụ sau minh họa việc sử dụng static variables -
using System;
namespace StaticVarApplication {
class StaticVar {
public static int num;
public void count() {
num++;
}
public int getNum() {
return num;
}
}
class StaticTester {
static void Main(string[] args) {
StaticVar s1 = new StaticVar();
StaticVar s2 = new StaticVar();
s1.count();
s1.count();
s1.count();
s2.count();
s2.count();
s2.count();
Console.WriteLine("Variable num for s1: {0}", s1.getNum());
Console.WriteLine("Variable num for s2: {0}", s2.getNum());
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Variable num for s1: 6
Variable num for s2: 6
Bạn cũng có thể khai báo một member function như static. Các hàm như vậy chỉ có thể truy cập các biến tĩnh. Các hàm tĩnh tồn tại ngay cả trước khi đối tượng được tạo. Ví dụ sau minh họa việc sử dụngstatic functions -
using System;
namespace StaticVarApplication {
class StaticVar {
public static int num;
public void count() {
num++;
}
public static int getNum() {
return num;
}
}
class StaticTester {
static void Main(string[] args) {
StaticVar s = new StaticVar();
s.count();
s.count();
s.count();
Console.WriteLine("Variable num: {0}", StaticVar.getNum());
Console.ReadKey();
}
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Variable num: 3