openplanning

Hướng dẫn và ví dụ C# Property

  1. C# Property
  2. Property trừu tượng (Abstract Property)

1. C# Property

Property là một thành viên (member) của một class, interface. Nó là mở rộng của một trường (field). Property cho phép bạn truy cập vào một trường hoặc thay đổi giá trị của trường đó, mà không cần thiết phải truy cập trực tiếp vào trường.

Bạn có thể tạo một Property chỉ cho phép truy cập vào một trường, không cho phép thay đổi giá trị của trường, và ngược lại. Đây chính là điểm lợi hại nhất của một Property.

Với trường (field), nếu bạn có thể truy cập vào nó từ bên ngoài, bạn cũng có thể thay đổi giá trị của nó, điều này rõ ràng là nguy hiểm, hãy xem ví dụ:
Employee.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Employee
    {
        // Để có thể truy cập ở bên ngoài, 
        // trường (field) này phải 'public' hoặc 'protected'.
        public string code;

        // Để có thể truy cập ở bên ngoài, 
        // trường (field) này phải 'public' hoặc 'protected'.
        public string name;

        public Employee(string code, string name)
        {
            this.code = code;
            this.name = name;
        }
    }


    class EmployeeTest
    {

        public static void Main(string[] args)
        {
            // Tạo một đối tượng Employee.
            Employee john = new Employee("E01", "John");

            // Bạn có thể truy cập vào tên của nhân viên
            // (name là trường public vì vậy bạn có thể truy cập ở bên ngoài).
            Console.WriteLine("Employee Name = " + john.name);

            // Tuy nhiên bạn cũng có thể gán giá trị mới cho trường name.
            // (Điều này rõ ràng là nguy hiểm).
            john.name = "Marry";

            Console.WriteLine("Employee Name = " + john.name);

            Console.Read();
        }
    }

}
Property là một giải pháp để giải quyết vấn đề nêu trên. Dưới đây là một ví dụ sử dụng Property Code, Name để truy cập vào trường code, name của class Employee2.
Employee2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Employee2
    {
        // Trường này là private,
        // nó không cho phép truy cập từ bên ngoài.
        private string code;

        // Trường này là private,
        // nó không cho phép truy cập từ bên ngoài.
        private string name;

        // Khai báo một property, là public, có thể truy cập từ bên ngoài.
        public string Code
        {
            get
            {
                return this.code;
            }
            set
            {
                // 'value' là một từ khóa đặc biệt,
                // nó ám chỉ giá trị mới được gán cho property.
                this.code = value;
            }
        }

        // Khai báo một property, là public, cho phép truy cập,
        // nhưng không cho phép gán giá trị mới.
        public string Name
        {
            get
            {
                return this.name;
            }
        }



        public Employee2(string code, string name)
        {
            this.code = code;
            this.name = name;
        }
    } 

}
Test:
Employee2Test.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Employee2Test
    {
        public static void Main(string[] args)
        { 

            // Tạo một đối tượng Employee.
            Employee2 john = new Employee2("E01", "John");

           
            Console.WriteLine("Employee Code = " + john.Code);
            Console.WriteLine("Employee Name = " + john.Name);
            Console.WriteLine("-------");

            // Gán giá trị mới cho property Code.
            john.Code = "E02";

            // Không thể gán giá trị mới cho property Name.
            // john.Name = "Marry"; // ==> Error!
            Console.WriteLine("Employee Code = " + john.Code);
            Console.WriteLine("Employee Name = " + john.Name);

            Console.Read();
        }
    }

}
Chạy ví dụ:
Employee Code = E01
Employee Name = John
------
Employee Code = E02
Employee Name = John

2. Property trừu tượng (Abstract Property)

Property sử dụng dụng để setget giá trị của một trường, về bản chất nó được coi là một phương thức đặc biệt, vì vậy nó cũng có thể khai báo trìu tượng (abstract), và nó sẽ được thực hiện (implements) tại một class con. Class có thuộc tính (property) khai báo là abstract thì nó phải khai báo là abstract. Các thuộc tính trừu tượng cũng có thể được khai báo trong Interface.
Animal là một class có khai báo 2 thuộc tính trừu tượng Name & Age:
Animal.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    abstract class Animal
    { 
        // Một property trừu tượng (abstract Property).
        public abstract string Name
        {
            get; 
        } 
        // Một property trừu tượng có set & get.
        public abstract int Age
        {
            get;
            set;
        }
    } 
}
Class Cat mở rộng từ Animal, và triển khai các thuộc tính trừu tượng khai báo trong Animal.
Cat.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{ 
    class Cat : Animal
    {
        private string name;
        private int age;

        // Thực hiện property trừu tượng khai báo trong lớp Animal.
        public override string Name
        {
            get
            {
                return this.name;
            }
        } 
        // Thực hiện property trừu tượng khai báo trong lớp Animal.
        public override int Age
        {
            get
            {
                return this.age;
            }
            set
            {
                this.age = value;
            }
        } 
        // Constructor.
        public Cat(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
    } 
}
Property trong Interface
Bạn cũng có thể khai báo Property trong một Interface, các thuộc tính này sẽ được thực hiện (implements) tại các class con.
IColor.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    interface IColor
    { 
        // Một property trừu tượng của Interface.
        String Color
        {
            get;
        }
    } 
}
Class Ball thi hành Interface IColor, nó thực hiện (implements) thuộc tính trừu tượng khai báo trong IColor.
Ball.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpPropertyTutorial
{
    class Ball : IColor
    {
        private string color; 
        // Thực hiện property được khai báo trong Interace IColor
        // (Không được viết từ khóa override ở đây,
        // vì nó đang thực hiện một property của Interface).
        public string Color
        {
            get
            {
                return this.color;
            }
        } 
        // Constructor.
        public Ball(String color)
        {
            this.color = color;
        }
    } 
}