Bạn đang xem bài viết Quản Lý Lớp (Class) Và Đối Tượng (Object) được cập nhật mới nhất trên website Channuoithuy.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.
Object – Instance (đối tượng)
Class (lớp)
Field (trường)
Property (thuộc tính)
Method (phương thức)
Constructor (phương thức khởi tạo)
Các thành phần static
Anonymous class (lớp nặc danh)
Inheritance (thừa kế)
Polymophism (đa hình)
Microsoft .NET Framework chứa hàng ngàn lớp (classes) và chúng ta đã làm quen với một số lớp như Console, Exception, v.v. trong các bài ở trên. Trong bài này chúng ta sẽ tìm hiểu kỹ hơn về cách tạo và quản lý lớp và đối tượng.
Object – instance (đối tượng – thể hiện)
Object là khái niệm cơ bản trong lập trình hướng đối tượng (object oriented programming). Đó là một cấu trúc đóng gói dữ liệu và chức năng như một đơn vị duy nhất và chỉ có thể truy cập đối tượng thông qua giao diện của nó như thuộc tính, phương thức. Quá trình tạo một đối tượng gọi là quá trình thực thể hoá hay thể hiện hoá (instantiating) bằng từ khoá new. Ví dụ tạo các đối tượng từ các lớp (sẽ tìm hiểu chi tiết ngay bên dưới) Calculator hay Integer như sau:
Calculator myCalculator = new Calculator(); int age = new int();myCalculator và age được gọi là các instance (thực thể hay thể hiện) hay phổ biến hơn là object (đối tượng).
Trước khi có object cần có một định nghĩa chi tiết về object thông qua class.
Class (lớp)
Class giống như một bản kế hoạch chi tiết cho object. Trong ví dụ trên chúng ta đã định nghĩa class Calculator có thể tạo ra nhiều thực thể (instance) hay đối tượng, như myCalculator. Cú pháp tạo một class:
public class Tên_class { }Các thành phần cơ bản trong class gồm các trường (fields), thuộc tính (properties), phương thức (methods) và phương thức constructor.
Field (trường)
Là các đặc điểm riêng của đối tượng, ví dụ đối tượng SinhVien có các đặc điểm riêng là firstName, lastName, sex,…Định nghĩa field giống như định nghĩa biến theo cú pháp sau:
Phạm_vi_truy_cập Kiểu_dữ_liệu Tên_field;Phạm_vi_truy_cập là phạm vi truy cập của field (sẽ được đề cập phần tiếp theo), có thể là Private, Public, Protected hay Friend. Ví dụ:
public class Person { private string firstName; }Thông thường các field là các đặc điểm (hay dữ liệu) riêng tư của đối tượng và không thể truy cập trực tiếp (phạm vi truy cập private). Do đó, để truy cập các fields, chúng ta dùng các thuộc tính (properties).
Property (thuộc tính)
Cú pháp
public Kiểu_dữ_liệu Tên_thuộc_tính {get; set;}Có thể dùng khối lệnh get (còn gọi là getter) để lấy dữ liệu từ các trường và khối lệnh set (còn gọi là setter) để gán giá trị cho trường. Cú pháp:
Phạm_vi_truy_cập Kiểu_dữ_liệu Tên_thuộc_tính { get { } set { } }Ví dụ thuộc tính FirstName lấy giá trị và gán giá trị cho trường firstName của class Person:
public class Person { private string firstName; public string FirstName { get { return firstName; } set { firstName = value; } } }Chúng ta không thể truy cập trực tiếp đến field firstName mà phải thông qua thuộc tính FirstName. Cụ thể:
Person myPerson = new Person(); myPerson.FirstName = "Ngoc Minh"; Label1.Text = myPerson.FirstName;Thuộc tính cũng có thể được khai báo với structure hay interface. Ví dụ khai báo trong structure:
struct ScreenPosition { ... public int X { get { ... } set { ... } } ... }Khai báo trong interface:
interface IScreenPosition { int X { get; set; } int Y { get; set; } }Thực thi các properties từ interface
struct ScreenPosition : IScreenPosition { public int X { get { ... } set { ... } } public int Y { get { ... } set { ... } } }Các khái niệm về structure hay interface được khám phá chi tiết trong các bài kế tiếp.
Thuộc tính chỉ đọc (read only) và thuộc tính chỉ ghi (write only)
* Trong C# việc tạo thuộc tính chỉ đọc đơn giản chỉ là bỏ khối lệnh set, tạo thuộc tính chỉ ghi chỉ cần bỏ khối lệnh get.
Method (phương thức)
Nếu field hay property là đặc điểm của đối tượng thì method là hành vi hay chức năng của đối tượng. Ví dụ đối tượng Person có các đặc điểm là firstName, lastName, dateOfBirth và phương thức là Talk () để giới thiệu bản thân.
Định nghĩa method trong class giống định nghĩa hàm hay thủ tục. Ví dụ khai báo phương thức Talk trong lớp Person:
public class Person { public void Talk() { } }Phương thức Talk có phạm vi truy cập là public (chi tiết về phạm vi trong phần sau của chương) nên có thể được truy cập trực tiếp bởi các đối tượng:
Person myPerson = new Person(); myPerson.Talk();Constructor (phương thức khởi tạo)
Là một phương thức đặc biệt, thực thi ngay khi chúng ta tạo một instance và theo sau từ khoá new. Phương thức constructor có tên trùng với tên class. Ví dụ tạo instance của lớp Calculator như sau (constructor được in đậm):
Calculator myCalculator = new Calculator();Nếu chúng ta không định nghĩa constructor trong class thì trình biên dịch sẽ tạo một constructor mặc định. Mặc định, trong C# phương thức constructor có tên trùng với tên lớp, không có tham số và không có giá trị trả về. Cú pháp:
public class Tên_class { public Tên_class() { } }Quá tải constructor
Bên cạnh constructor mặc định, chúng ta có thể định nghĩa nhiều constructor trong class và các contructor này phải khác nhau về danh sách các tham số (giống quá tải phương thức). Ví dụ class Person có thể định nghĩa như sau:
public class Person { private string firstName; public Person () { firstName = "Minh"; } public Person (string fName) { firstName = fName; } }Với cách định nghĩa class Person như trên, chúng ta có thể có hai cách (hai phiên bản) tạo instance cho Person:
Person myPerson = new Person(); Person myPerson = new Person("Minh");Thỉnh thoảng, biến cục bộ của phương thức trùng với biến của lớp (fields), ví dụ hàm constructor thứ hai trong ví dụ trên có thể viết:
public Person (string firstName) { }Nếu chúng ta gán firstName đến firstName của lớp, một số người bắt đầu với C# sẽ thường mắc lỗi như sau:
public Person (string firstName) { firstName = firstName; }Trình biên dịch vẫn thực thi nhưng sẽ không phân biệt được firstName nào là biến cục bộ của phương thức, firstName nào là field của lớp. Giải pháp cho tình huống này là dùng từ khoá this – tham chiếu đến instance hay object hiện tại của lớp, đoạn mã constructor được viết lại như sau:
public Person (string firstName) { this.firstName = firstName; }.NET cũng cung cấp cho bạn một cách khác để tạo object và khởi tạo giá trị cho thuộc tính. Cách này gọi là object initializer.Ví dụ class Person có thuộc tính FirstName:
public class Person { public string FirstName {get;set;} }Tạo instance của Person và khởi tạo thuộc tính FirstName:
Person myPerson = new Person(){FirstName = "Minh" }; MessageBox.Show(p.FirstName);// MinhCác thành phần tĩnh (lớp, phương thức, dữ liệu)
Khi sử dụng một số hàm toán học trong C#, ví dụ tính căn bậc hai của một số number, chúng ta có thể dùng phương thức sqrt của phương thức Math như sau:
x = Math.sqrt(number);Cho đến thời điểm này, muốn sử dụng các thành phần của một lớp là thông qua các instance hay object của lớp đó. Tuy nhiên, ví dụ trên, chúng ta đã truy cập trực tiếp đến phương thức sqrt bằng tên của lớp (Math). sqrt là phương thức tĩnh (static) – phương thức có thể được truy cập thông qua tên lớp. Các thành phần static trong một lớp có thể được truy cập thông qua tên lớp và cũng có rất nhiều lợi ích.
Tạo ra một field có thể chia sẻ
Bằng cách tạo field kiểu static, chúng ta có thể chia sẻ field này giữa các instance hay object. Ví dụ chúng ta có hai field trong lớp Student là studentName và Count như sau:
public class Student { public static int Count = 0;// static field private string studentName; public Student(string studentName) { this.studentName = studentName; Count++; } }Tạo 4 đối tượng từ lớp Student:
Student student1 = new Student("Minh"); Student student2 = new Student("Khiem"); Student student3 = new Student("Dung"); Student student4 = new Student("Hoang");Mỗi lần chúng ta tạo một object, biến tĩnh Count sẽ tăng 1. Bây giờ, nếu chúng ta muốn biết có bao nhiêu đối tượng Student được tạo ra, đoạn mã như sau:
MessageBox.Show("Number of Students: " + Student.Count);Kết quả:
Từ khoá const
Có hai cách tạo field static là:
– Dùng từ khoá static (như ví dụ trên)
– Dùng từ khoá const (như ví dụ dưới)
Ví dụ tạo field bằng từ khoá const:
public class MyMath { public const double PI = 3.14; }Hiển thị PI:
MessageBox.Show("PI = " + MyMath.PI);Các lớp static
C# cho phép tạo các lớp static. Lớp static có các đặc điểm sau:
– Chỉ chứa các thành phần static (field, method,…), ví dụ:
public static class MyMath { public static double Sin(double x) {...} public static double Cos(double x) {...} public static double Sqrt(double x) {...} }– Không thể tạo các instance (với từ khoá new), ví dụ sau đây sẽ bị lỗi:
MyMath ma = new MyMath();// lỗi– Không được thừa kế trừ Object:
Kiến thức về thừa kế sẽ được đề cập chi tiết hơn trong phần kế tiếp nhưng ví dụ sau sẽ giúp dễ hiểu hơn về đặc điểm này của lớp static. Chúng ta có lớp MyMath như sau:
public class MyMath { public const double PI = 3.14; }Lớp MyMath1 được thừa kế từ lớp MyMath:
public class MyMath1 : MyMath { }Hiển thị PI:
Bây giờ sửa lại lớp MyMath thành lớp static như sau:
public static class MyMath { public const double PI = 3.14; }Sẽ không xuất hiện PI trong MyMath1:
Nếu bạn cố tình nhập PI thì sẽ báo lỗi:
– Không chứa instance constructor trừ khi dùng static constructor. Chúng ta cần phân biệt instance constructor và static constructor. Chúng ta đã đề cập đến phương thức constructor ở trên và có thể gọi là instance constructor – vì có thể gọi trực tiếp trong quá trình tạo các instance (bằng từ khoá new). Một static constructor có các đặc điểm sau:
+ Không dùng các từ khoá thể hiện phạm vi truy cập (public, private, internal, protected) và không nhận tham số.
Ví dụ lớp static MyMath với một static constructor như sau:
public static class MyMath { public const double PI = 3.14; static MyMath(){ } }Nếu chúng ta định nghĩa static constructor có tham số sẽ bị lỗi:
Nếu chúng ta định nghĩa static constructor với các từ khoá thể hiện phạm vi truy cập (access modifiers):
+ static constructor được gọi một cách tự động để khởi tạo lớp trước khi instance đầu tiên được tạo hay bất cứ thành viên static nào đó được tham chiếu và nó chỉ thực thi chỉ một lần. Xét ví dụ sau chúng ta sẽ thấy static constructor thực hiện đầu tiên và chỉ một lần:
public class MyMath { public const double PI = 3.14; public static int count = 0; public static int num_ins = 0; static MyMath() { count++; } public MyMath() { num_ins++; } public void show() { MessageBox.Show("Instane " + num_ins + " " + "with count = " + count); } }Tạo hai instance của lớp MyMath:
MyMath math1 = new MyMath(); math1.show(); MyMath math2 = new MyMath(); math2.show();Kết quả count = 1 mặc dù tạo 2 instance:
+ Một static constructor không thể được gọi trực tiếp và người dùng không thể kiểm soát khi static constructor được thực thi trong chương trình.
+ Nếu static constructor phát sinh một ngoại lệ thì runtime sẽ không gọi nó lần thứ hai và vẫn giữ trạng thái không khởi tạo trong suốt vòng đời của ứng dụng.
Các lớp nặc danh (anonymous classes)
Một lớp nặc danh là một lớp không có tên. Có thể tạo lớp nặc danh dễ dàng với tử khoá new và một cặp ngoặc chứa các fields với các giá trị khởi tạo như ví dụ tạo một object của một lớp nặc danh:
var myAnonymousObject = new { Name = "John", Age = 44 };Trong ví dụ trên, lớp nặc danh có hai fields là Name với giá trị khởi tạo John và Age với giá trị khởi tạo là 44. Khi thực thi, trình biên dịch sẽ gán tên cho lớp (và chúng ta không biết) và cũng sẽ gán các kiểu dữ liệu cho các fields tương ứng với giá trị mà nó được khởi tạo (ví dụ Age kiểu string, Age kiểu int).
Có thể truy cập đến các fields như sau:
myAnonymousObject.Namehay
myAnonymousObject.AgeLớp nặc danh có một số hạn chế:
Chỉ chứa các field có phạm vi public
Các field phải luôn được khởi tạo
Các field không thể là static
Không thể tạo phương thức
Inheritance (thừa kế)
Một trong những khái niệm quan trọng và rất mạnh của mô hình hướng đối tượng, bên cạnh tính đóng gói đã đề cập ở trên, là khái niệm thừa kế. Thừa kế nhằm tận dụng dữ liệu và chức năng có sẵn để phát triển, mở rộng ứng dụng ở mức cao hơn. Ví dụ các lớp Student hay Employee có thể kế thừa từ lớp Person vì chúng đều cần các đặc điểm như firstName, lastName hay phương Talk()… Lớp Person được gọi là lớp cha, lớp cơ sở (base class), hay lớp được thừa kế; các lớp Student hay Employee được gọi là lớp con hay lớp thừa kế.
Trong .NET, lớp System.Object là lớp cha của mọi lớp.
Tuỳ theo phạm vi truy cập (private, public, protected, internal) mà các thuộc tính hay phương thức của lớp cha sẽ được kế thừa từ lớp con. Một lớp muốn thừa kế một lớp khác phải dùng dấu hai chấm (:) theo cú pháp:
public class Tên_lớp_con : Tên_lớp_cha { }Ví dụ lớp Student thừa kế từ lớp Person như sau:
public class Student : Person { }C# chỉ hỗ trợ thừa kế đơn, nghĩa là một lớp không được phép thừa kế từ hai hay nhiều lớp (muốn dùng đa thừa kế chúng ta có thể dùng interface).
Chúng ta có thể gọi phương thức constructor của lớp cơ sở trong lớp thừa kế bằng cách sử dụng từ khoá base. Ví dụ:
class Person { public Person(string name) { ... } ... } class Student : Person { public Student(string name) : base(name) { ... } ... }Giả sử chúng ta có lớp Employee cũng thừa kế từ lớp Person. Như vậy, chúng ta có một lớp cha và hai lớp con như sau:
class Person { ... } class Student : Person { ... } class Employee : Person { ... }Chúng ta không thể gán một đối tượng đến một biến có kiểu dữ liệu khác kiểu của đối tượng, ví dụ sau bị lỗi:
Student st = new Student(); Employee e = st;Tuy nhiên, chúng ta có thể gán một đối tượng đến biến có kiểu dữ liệu được khai báo là lớp cao hơn lớp, là kiểu của đối tượng, trong cấu trúc thừa kế. Ví dụ sau hợp lệ:
Student st = new Student(); Person p = st;Trường hợp ngược lại là không đúng như ví dụ sau:
Person p = new Person(); Student st = p;Điều này cũng tự nhiên bởi vì không phải mọi Person đều là Student (có thể là Employee), nhưng mọi Student phải là Person.
Polymophism (đa hình)
Các phương thức trong lớp cha có thể có thể được thừa kế từ lớp con nếu phạm vi truy cập của nó là public hay protected. Mặc khác, chúng ta có thể định nghĩa lại các phương thức được thừa kế nhờ một tính năng thú vị khác trong mô hình hướng đối tượng là tính đa hình (polymophism). Ví dụ phương thức Talk() của lớp Person có thể được thừa kế và định nghĩa lại trong lớp Student. Muốn vậy, khi định nghĩa phương thức Talk trong Person phải có từ khoá virtual và phương thức Talk trong Student được định nghĩa lại với từ khoá override, cụ thể lớp Person:
Lớp Person
public class Person { public virtual void Talk() { } }Lớp Student
public class Student : Person { public override void Talk(msg As String) { } }Phạm vi truy cập (access modifiers)
Các phần trên chúng ta đã đề cập đến phạm vi truy cập của các thuộc tính hay phương thức của đối tượng. Cụ thể có 4 phạm vi truy cập thể hiện qua 4 từ khoá là public, private, protected và internal, có thể được mô tả như sau:
VB C# Mô tả
Public public Thuộc tính, phương thức có thể được truy cập bởi lớp sở hữu và các lớp khác.
Protected protected Thuộc tính, phương thức có thể được truy cập bởi lớp sở hữu và các lớp thừa kế nó.
Friend internal Thuộc tính, phương thức có thể được chia sẻ bởi lớp sở hữu và các lớp thừa kế và các lớp trong cùng một assembly. Một assembly là một tập hợp các files được biên dịch (như exe hay dll) chứa các code .NET có thể dùng lại.
Private private Thuộc tính, phương thức có thể được truy cập chỉ bởi lớp sở hữu.
Ví dụ:
public class A { public int x; private string y; protected double i; protected internal date j; } public class B : A { public void Init() { x = 5; i = 4.5; j = chúng tôi y = "Hello";// phát sinh lỗi vì y là private } } public class C { public void Test() { B myB = new B(); myB.x; myB.Init(); } }Phương thức mở rộng (extension method)
Thừa kế là tính năng mạnh mẽ giúp chúng ta mở rộng tính năng cho các thành phần sẵn có. Tuy nhiên, trong một vài trường hợp, sử dụng thừa kế là không hợp lệ. Ví dụ chúng ta muốn thêm phương thức Negate() đến kiểu int dùng để hiển thị số nguyên là phủ định của số nguyên hiện tại. Sử dụng thừa kế là không khả thi vì int hay System.Int32 là một structure chứ không phải là một class nên không thể dùng thừa kế. Giải pháp cho các trường hợp này là dùng phương thức mở rộng.
Phương thức mở rộng cho phép chúng ta mở rộng một kiểu có sẵn (lớp hay structure) với các phương thức tĩnh.
Chúng ta định nghĩa một phương thức mở rộng trong một lớp static và xác định kiểu mà chúng ta cần mở rộng cho tham số đầu tiên của phương thức cùng với từ khoá this. Ví dụ chúng ta thêm phương thức Negate() đến kiểu int nên tham số đầu tiên của Negate sẽ có kiểu int và đi kèm từ khoá this như sau:
static class Util { public static int Negate(this int i) { return –i; } } int x = 12; MessageBox.Show(x.Negate().ToString());//-12Trình biên dịch C# sẽ tự động phát hiện tất cả các phương thức mở rộng trong tất cả các lớp tĩnh nên chúng ta không cần khai báo lớp tĩnh chứa phương thức Negate (Util). Nếu sử dụng lớp Util, chúng ta có thể viết:
int x = 12; MessageBox.Show(Util.Negate(x).ToString());//-12Phần 22: Class Và Object
Ở phần trước chúng ta đã đề cập tới định nghĩa và các tính chất của Lập trình Hướng đối tượng (OOP). Trong phần này chúng ta sẽ bắt đầu ứng dụng những lí thuyết ấy vào thực hành với C++.
Hãy đọc lại bài Cấu trúc dữ liệu – struct và class. Cài đặt class cũng gần giống như struct, ta sử dụng cú pháp sau:
Ví dụ
Vậy có gì khác biệt giữa struct và class? Có 2 sự khác biệt ở đây
Về mặt ngữ nghĩa, struct thường được sử dụng để định nghĩa các kiểu dữ liệu Plain-Old-Data (dữ liệu không, không bao gồm các chương trình con hay các yếu tố đóng gói). class thường được sử dụng trong lập trình OOP đầy đủ.
Quyền truy cập mặc định tới các yếu tố trong struct là public, còn với class là private.
struct có thể chỉnh sửa được thành class và ngược lại, và có thể sử dụng được các yếu tố của OOP như nhau. Để thống nhất, từ nay trở đi ta sẽ chỉ sử dụng class.
Sau khi định nghĩa class xong, ta có thể định nghĩa các object như các biến thông thường.
Ta cũng truy cập các yếu tố public của object bằng toán tử dấu chấm ..
Ở trên ta có nhắc tới quyền truy cập. Đối với các yếu tố trong class, quyền truy cập mặc định là private – các yếu tố trong class chỉ có thể được truy cập từ nội bộ bên trong class, và từ bên ngoài không thể gọi vào.
Ngoài private ra, còn có 2 kiểu quyền truy cập khác:
public: Yếu tố public có thể được truy cập từ bên ngoài đối tượng.
protected: Yếu tố protected không thể được truy cập từ bên ngoài đối tượng, nhưng có thể truy cập được từ các đối tượng thuộc class con của class hiện tại. Class con và sự thừa kế sẽ được đề cập kĩ hơn trong các bài viết sau.
Để có thể thiết lập quyền truy cập cho đối tượng, ta sử dụng các từ khóa private, public và protected đi kèm cùng dấu hai chấm :. Các yếu tố tiếp theo sau từ khóa sẽ được áp dụng quyền truy cập tương ứng, cho tới khi có một từ khóa mới xuất hiện.
Trong class ví dụ ở trên, void privateVoid() chỉ có thể được gọi từ bên trong đối tượng thuộc vào class Cat, void publicVoid() có thể gọi được từ bất kì đâu, còn void protectedVoid() chỉ có thể gọi từ bên trong đối tượng thuộc class Cat, hoặc các đối tượng thuộc vào class con của Cat.
Đây chính là encapsulation – tính đóng gói của lập trình hướng đối tượng. Với cách đặt quyền truy cập cho các yếu tố trong class, ta có thể giới hạn sử dụng của class tới những chức năng cần thiết đối với bên ngoài.
Tương tự đối với struct, ta cũng có thể viết hàm khởi tạo để khởi tạo các yếu tố của object thuộc class. Ví dụ:
Output
Hàm phá hủy (destructor) là một loại chương trình con đặc biệt khác, được gọi ra khi object bị phá hủy (ví dụ: khi chương trình kết thúc và bộ nhớ được giải phóng). Hàm phá hủy được định nghĩa theo cú pháp
Ví dụ như khi áp dụng vào class Cat ở trên:
Output
Ta có thể sử dụng destructor để dọn dẹp dữ liệu sau khi đối tượng bị phá hủy, lưu trữ thông tin quan trọng, vân vân…
Copy constructor là một loại hàm khởi tạo đặc biệt – nó được gọi ra khi một object của class được gán giá trị bằng một object khác (ví dụ như khi gán bằng nhau, khi đặt giá trị cho tham số của hàm, vân vân). Khi đó ta có thể sử dụng copy constuctor để can thiệp vào quá trình gán đó.
Một class thường không bắt buộc phải có copy constructor – trình dịch sẽ tự động xử lý việc gán nếu như không có, tuy nhiên các class có biến kiểu con trỏ và có khả năng cấp phát bộ nhớ động thì bắt buộc phải có copy constructor.
Cú pháp của copy constructor là
const là từ khóa hằng số – nó mang ý nghĩa rằng biến được khai báo sau nó là hằng số và sẽ không bao giờ bị thay đổi. Chú ý kiểu dữ liệu ở đây là truyền tham biến (toán tử &).
Ví dụ:
Output
Tất cả các object thuộc class đều có thể truy cập tới giá trị con trỏ bộ nhớ của mình thông qua từ khóa this. Ví dụ:
Hai giá trị được in ra sẽ khác nhau, do hai đối tượng được lưu ở hai vị trí bộ nhớ khác nhau.
Các thao tác đối với con trỏ bộ nhớ trên class cũng tương tự như với struct.
Giả sử bây giờ ta muốn đếm số lượng object Cat đã được sử dụng trong chương trình. Ta có thể sử dụng một biến global catNumber, và mỗi khi chạy hàm khởi tạo một object Cat thì ta tăng catNumber lên một. Tuy nhiên mỗi khi sử dụng class Cat, ta sẽ lại phải khai báo bên ngoài một biến catNumber, trong khi rõ ràng biến catNumber này vẫn luôn luôn gắn kèm về mặt ý nghĩa với class Cat. Điều này có thể sinh ra nhiều rắc rồi trong tương lai.
Giải phải là thay vì để catNumber là một biến global, ta sẽ khai báo catNumber thành một biến tĩnh – static – của class. Các yếu tố static hoàn toàn độc lập với các object của class – cho dù có bao nhiêu object thuộc class trong chương trình, các yếu tố static sẽ luôn luôn chỉ có một, và có thể truy cập thông qua toán tử :: (toán tử truy cập scope).
Các biến static sẽ được khởi tạo cùng với object đầu tiên được tạo ra của class. Nếu như chưa có object nào được tạo ra, nhưng ta vẫn muốn truy cập vào biến static, ta phải khai báo giá trị của biến static ở bên ngoài, sử dụng toán tử ::.
Tương tự, ta cũng có thể định nghĩa các chương trình con static độc lập với toàn bộ object của class bằng từ khóa static.
Ví dụ:
Output
Một ứng dụng quan trọng của các yếu tố static là Design Pattern Singleton – thiết kế chương trình đảm bảo chỉ có một object của class tồn tại trong suốt quá trình chạy của chương trình.
Giả sử ta có một class rất to và nặng, chỉ cần tạo ra một lần trong toàn bộ chương trình (ví dụ như database). Khi đó ta sẽ lưu một object của class đó dưới dạng static, và cho phép gán giá trị của object static này cho các đối tượng thông qua một hàm getInstance() thay vì phải khởi tạo lại từ đầu.
Phần sau: [C++ Cơ bản] Phần 23: Tính thừa kế – Class con (subclass)
Phương Pháp Quản Lý Trẻ Và Dạy Trẻ Cách Quản Lý Lớp Học Tại Kidzone
Chúng ta không chỉ nói cho trẻ biết cần hành xử như thế nào, chúng ta thể hiện cách hành xử đúng để cho trẻ thấy.
Chúng ta bớt tập trung vào xử phạt hành vi xấu, mà tập trung vào việc khích lệ, khen ngợi hành vi tốt.
Mỗi trẻ học hỏi theo một cách khác nhau.
Những Kỳ vọng trong việc giáo dục trẻ
Trẻ em học hỏi theo những cách khác nhau. Một số học hỏi từ những gì trẻ thấy, số khác qua những gì được nghe, số khác lại qua những gì được làm. Nếu chúng ta ép trẻ chỉ học theo một cách, có thể trẻ chẳng học được gì. Vì thế, Kidzone hướng đến một phương pháp dạy học đáp ứng được tất cả các phong cách học hỏi khác nhau của học sinh. Chúng tôi nỗ lực điều chỉnh các bài học của mình để phù hợp với tất cả học sinh thay vì để cho những em có phong cách học khác biệt bị tụt hậu. Trẻ phải biết về nội quy học tập trong lớp nhưng đồng thời phải được là chính mình. Nếu trẻ tham gia lớp học, lắng nghe, trả lời câu hỏi, thì việc nhảy lên nhảy xuống vì hưng phấn không phải là hành vi cần điều chỉnh. Có một số bé không thể ngồi im lâu như các bạn khác. Hơn nữa, tại Kidzone, chúng tôi không muốn một lớp học nghiêm túc và im lặng. Với bất kỳ ai, người lớn nay trẻ em, nếu như bạn không cảm thấy thoải mái và dễ chịu, bạn không thể học được.
Kiểm soát Hành vi Và Giải quyết Bất đồng
Kindzone được tuyên bố là “miền đất không bạo lực”. Kidzone là một môi trường nơi trẻ có thể cảm thấy an toàn và thoải mái. Chúng tôi không dạy dỗ trẻ em, chúng tôi đào tạo những người lớn tương lai. Trẻ em thường sử dụng bạo lực với những trẻ khác, bởi vì các em vẫn còn đang học cách sử dụng ngôn ngữ. Chúng tôi nhắm vào việc dạy trẻ cách giải quyết những bất đồng bằng ngôn ngữ, dạy trẻ thói quen hợp tác, thương yêu và đồng cảm. Đây là những kỹ năng thiết yếu đối với người lớn và con người nói chung. Do đó, biện pháp giải quyết bất đồng là không thể thiếu trong việc dạy cho trẻ ý thức trách nhiệm đối với hành động của mình ở Kidzone. Trong đó, biết xin lỗi khi phạm lỗi là yếu tố then chốt. Trẻ cần nhận ra được việc gây hại cho người khác là đi ngược với xã hội, có hại và sai trái.
Một số em có thể sợ nói xin lỗi vì cảm thấy đó giống như một hình phạt. Nhưng không phải vậy. Nói xin lỗi tức là trẻ đã nhận ra mình làm sai và phải làm điều đúng để điều chỉnh hành vi đó. Khi trẻ nói xin lỗi, nhận lỗi, chúng ta cần khen ngợi trẻ nhiều và trước mặt các bạn khác. Vấn đề là, nếu trẻ từ chối nói xin lỗi? Trường hợp này, chúng ta cho trẻ 2 lựa chọn: con xin lỗi bạn hoặc con ra khỏi cuộc chơi/lớp học. Điều này cũng có chút xíu phức tạp vì chúng ta không thể tốn quá nhiều thời gian của lớp vào việc chờ trẻ nói lời xin lỗi. Vì thế, cần thực hiện nhanh. Hai tay đưa lên để biểu thị cho hai lựa chọn: Xin lỗi hoặc Ra ngoài? 3, 2, 1.. và trẻ phải ra quyết định. Trẻ có thể còn quá nhỏ để có thể hiểu đầy đủ việc giải thích tại sao hành động đó là sai, nhưng trẻ hoàn toàn không cần phát triển đầy đủ về mặt ngôn ngữ để hiểu được tông giọng của cô và hoàn cảnh lúc đó. Cô rất thất vọng vì con đã đánh bạn. Con biết là không được như thế mà. Cô sẽ rất vui nếu các con đối xử tốt với nhau…
Vì thế, có thể nói, ở Kidzone tuyệt đối không có hình phạt đánh trẻ. Làm sao chúng ta có thể dạy trẻ không được đánh bạn nếu chúng ta đánh trẻ, điều này thật vô lý và có thể khiến trẻ bối rối. Trẻ có thể nghĩ “Khi nào mình lớn, mình có thể được phép đánh”. Điều cần thiết là trẻ phải nhận biết được hành vi của mình là sai và muốn sửa chữa. Với hình phạt đánh trẻ, trẻ sẽ chẳng học được gì. Nếu chúng ta phạt trẻ dưới hình thức đánh, trẻ sẽ chỉ học được rằng không được đánh bạn lúc cô có ở đó bởi vì cô sẽ phạt mình.
Bắt chước
Trẻ em không ngừng quan sát thế giới xung quanh mình. Các em học hỏi bằng cách bắt chước. Một số trẻ sẽ bắt chước giống hệt mọi cử chỉ hành động của người lớn, từ giọng điệu cho tới nét mặt. Giận dữ là một cảm xúc tự nhiên, nhưng người lớn chúng ta đã học được cách kiểm soát cơn giận của mình, và chúng ta cần dẫn dắt trẻ bằng cách làm gương. Hơn nữa, sự thật đã được chứng minh là khi trẻ sợ hãi, điều đó có thể ảnh hưởng rất lớn đến khả năng học hỏi của trẻ. Sự giận dữ không giúp trẻ học được các quy tắc hay hiểu được hậu quả hành động của các em. Chúng ta không thể lớn tiếng la mắng trẻ mà mong chờ bé sẽ nói chuyện nhẹ nhàng với bạn bè. Chúng ta dạy dỗ bằng cách hướng dẫn và khích lệ chứ không phải bằng la lối.
Khái Niệm, Đối Tượng Và Phương Pháp Nghiên Cứu Của Tâm Lý Học Tư Pháp
65102
1. Đối tượng nghiên cứu của tâm lý học tư pháp
Đối tượng nghiên cứu của tâm lý học tư pháp:
Nghiên cứu tâm lý của con người, nhưng không phải là nghiên cứu về tâm lý chung của con người. Tâm lý học tư pháp đi vào nghiên cứu tâm lý tư pháp hình sự: các vấn đề tâm lý phát sinh trong giải quyết vụ án hình sự & giáo dục, cải tạo người phạm tội.
2. Phương pháp luận & phương pháp nghiên cứu của Tâm lý học tư pháp
a) Phương pháp luận của Tâm lý học tư pháp
Phương pháp luận của một ngành khoa học được hiểu là những phạm trù, quan điểm, khái niệm chỉ đạo, định hướng cho việc nghiên cứu cho ngành khoa học đó.
Phương pháp luận của Tâm lý học tư pháp
– Chủ nghĩa duy vật biện chứng – Chủ nghĩa duy vật lịch sử
*) Vai trò phương pháp luận của Chủ nghĩa duy vật biện chứng
– Định hướng nghiên cứu khách quan về tâm lý con người
– Định hướng nghiên cứu toàn diện về tâm lý con người: đánh giá trên các phương diện khác nhau, trong các mối quan hệ đa dạng, phức tạp, quan hệ tổng hòa… v/d: kẻ phạm tội đặc biệt nghiêm trọng nhưng cũng là con người, cũng có những mối quan hệ gia đình, xã hội đặc thù. Chúng ta có thể khai thác, nghiên cứu các mối quan hệ ấy để tác động hiệu quả, để thấy được những mảng sáng, mảng tối trong con người, mở ra hướng hoàn lương cho họ.
– Định hướng nghiên cứu con người ở trạng thái “động”
*) Vai trò phương pháp luận của chủ nghĩa duy vật lịch sử
– Với quan điểm này thì con người là sản phẩm của lịch sử, giai cấp, văn hóa, tôn giáo, truyền thống nhất định – Bản chất con người có thể thay đổi cùng với điều kiện lịch sử thay đổi – Con người sống trong những hoàn cảnh lịch sử khác nhau là có sự khác nhau trong ý thức và hành động.
b) Các phương pháp nghiên cứu cụ thể của Tâm lý học tư pháp
Tâm lý học tư pháp sử dụng phần lớn các phương pháp nghiên cứu của xã hội học, tâm lý học nói chung để khám phá đối tượng nghiên cứu. Gọi chung là phương pháp nghiên cứu nhân cách cá nhân.
– Phương pháp quan sát: là phương pháp dùng thị giác để quan sát các biểu hiệu bề ngoài (hành vi, thái độ) của con người một cách có tổ chức, có hệ thống và có mục đích rõ ràng, từ đó nhận thức về tâm lý của người được quan sát.
– Phương pháp đàm thoại (phỏng vấn): là phương pháp nghiên cứu tâm lý cá nhân thông qua giao tiếp và đặt câu hỏi có nội dung, mục đích, kế hoạch được định sẵn. Thông qua đàm thoại tâm lý của cá nhân được bộc lộ và có thể nhận thức được. Phương tiện chính: ngôn ngữ nói trực tiếp để trao đổi, tìm hiểu. Vừa có đàm thoại, vừa kết hợp quan sát. Yêu cầu câu hỏi ngắn gọn, mạch lạc, rõ ràng, đúng trọng tâm.
– Phương pháp thực nghiệm: Là phương pháp nghiên cứu tâm lý cá nhân trong những điều kiện tự nhiên sẵn có hoặc được sắp xếp trước nhằm kiểm tra vấn đề tâm lý được đặt ra.
– Phương pháp phiếu điều tra: Là phương pháp nghiên cứu bằng cách sử dụng bảng câu hỏi được soạn thảo nhằm thu thập ý kiến cá nhân, từ đó tâm lý cá nhân được bộc lộ và có thể nhận thức được. Hạn chế: nhiều khi người trả lời phiếu trả lời không thật, phóng đại, nói quá, nhưng mình lại ko thể quan sát được tâm lý cá nhân người đó trực tiếp.
– Phương pháp nghiên cứu tiểu sử: Là phương pháp nghiên cứu tiểu sử của con người thông qua các tài liệu viết về bản thân họ. Tài liệu tiểu sử có thể do người đó tự viết (nhật ký), người khác viết về họ (bạn bè, nhà nghiên cứu), tài liệu của cơ quan nhà nước quản lý (lý lịch).
– Phương pháp nghiên cứu hồ sơ, tài liệu: Là phương pháp nghiên cứu tâm lý thông qua các hồ sơ, tài liệu về tội phạm và người phạm tội được tổng kết, ghi nhận, công bố. Đây là những tài liệu khoa học: công trình khoa học, báo cáo khoa học, đề tài nghiêu cứu khoa học về một loại tội nào đó (v/d: tội phạm ma túy, tội phạm chức vụ, kinh tế, tham nhũng…) với những đặc điểm pháp lý hình sự như thế nào, tội phạm học ra sao, đặc điểm tâm lý, quan điểm sống… của những người phạm tội thuộc nhóm tội đó như thế nào…
– Phương pháp giám định (phương pháp chuyên gia): là sử dụng đánh giá, kết luận của các nhà chuyên môn, có quá trình sử dụng nghiệp vụ cao để đánh giá. v/d: giám định tâm thần, giám định pháp y… vụ việc ở ngành nào, lĩnh vực nào cần có chuyên gia ở lĩnh vực đó: v/d: chuyên gia xây dựng cơ bản, chuyên gia kết cấu vật liệu, chuyên gia tài chính ngân hàng…v/d:cần phải trưng cầu giám định để biết tỷ lệ thương tật…
– Phương pháp nghiên cứu nhóm, tập thể: Là phương pháp tìm hiểu tâm lý cá nhân thông qua việc nghiên cứu tâm lý nhóm, nơi mà cá nhân đó có sự giao tiếp, chia sẻ, cộng tác thường xuyên, ổn định. v/d: hỏi ý kiến bạn bè, đồng nghiệp… ngưu tầm ngưu, mã tầm mã… hãy cho tôi biết anh chơi với ai…
3. Mục đích, ý nghĩa của Tâm lý học tư pháp
a) Mục đích của Tâm lý học tư pháp
– Cung cấp tri thức về những chủ thể tham gia vào quá trình giải quyết vụ án hình sự & giáo dục, cải tạo người phạm tội.
– Góp phần xây dựng, áp dụng các biện pháp giáo dục, cảm hóa người phạm tội.
– Góp phần phòng ngừa tội phạm thông qua kiến nghị những biện pháp tác động tích cực đến tâm lý con người, khắc phục biểu hiện tâm lý tiêu cực.
Cập nhật thông tin chi tiết về Quản Lý Lớp (Class) Và Đối Tượng (Object) trên website Channuoithuy.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!