Generic và list trong C#

Anh chị cho em hỏi cái dòng ở đoạn dưới
Tại sao phải có cái where T: mới kế thừa được class Employee vậy ạ?

class Worker<T> where T: Employee

nằm ở trong đoạn

class Employee
{
    string Name;
    int emId;

    public Employee(string NAME, int id)
    {
        Name = NAME;
        emdId = id;
    }

    public string P_Name
    {
        get { return Name; }
    }

    publci int P_emId { get { return emId; } }
}

class Worker<T> where T: Employee
{
    T[] name = new T[3];
    int cnt = 0;

    public void Add(T val)
    {
        name[cnt] = val;
        cnt++;
    }

    public void Show()
    {
        for (int i = 0; i < cnt; i++)
        {
            Console.WriteLine(name[i].P_Name + "," + name[i].P_emId);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<int> list1 = new List<int>(5);
        List<string> list2 = new List<string>("a b c");
        // ...
    }
}

cái list<int>(5) là sức chứa của list là 5 phải không ạ?
Vậy còn cáilist<string>("a b c") nghĩa là sao vậy ạ? là contructor sao ạ?

Đây không phải là kế thừa. Đây là đảm bảo T phải là kiểu Employee.
Như vậy khi khai báo một đối tượng kiểu Worker, nếu generic type của nó không phải Employee thì sẽ báo lỗi.

List<T>(int x) có nghĩa là initial capacity bằng x, chứ không phải sức chứa, muốn hiểu initial capacity là gì thì bạn tự tìm hiểu thêm cấu trúc dữ liệu thực sự của List nhé

List<T>(IEnumerable<T> x) ví dụ như List<string>("a b c") thì là khởi tạo list với thành phần giống như x

Nói chung bạn đọc ở MSDN là rõ nhất: https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=netframework-4.7.2

3 Likes

Cám ơn anh nhiều ạ. Anh cho em hỏi thêm một câu là

public class TimeInforEvent: EventArgs
{
    public TimeInforEvent(int hour, int minute, int second
    {
        // ...
    }
    // ...
}
class ListViewItemComparer : IComparer
{
    private int col = 0;

    public ListViewItemComparer(int column)
    {
        col = column;
    }

    public int Compare(object x, object y)
    {
        return Decimal.Compare(
            Int32.Parse((ListViewItem)x).SubItems[col].Text),
            Int32.Parse((ListViewItem)y).SubItems[col].Text));
    }
}

EventArgsIComparer được gọi là gì ạ? Cái này có sẵn trong C# phải không ạ? Và cái code trong đoạn trên có phải là kế thừa ko ạ?

EventArgs là một class được định nghĩa trong .NET Framework chứ không có sẵn trong C# (tức là các platform cho C# mà không sử dụng .NET Framework thì không có)

IComparer là một interface cũng được định nghĩa trong .NET Framework.
Một cách đơn giản để biết cái gì thuộc về C#, cái gì thuộc về .NET, đó là bạn xoá using System; và các loại using System.... là biết, những cái thuộc .NET Framework sẽ báo lỗi.

Đối với class ta sử dụng khái niệm “kế thừa” - “inherit”. Đối với interface ta sử dụng khái niệm “đính kèm” - “implement”. Class được kế thừa gọi là “base class” (trong một số ngôn ngữ khác có các khái niệm tương tự là “parent class” hay “super class”.

Khi một class kế thừa một class, class đó sẽ được kế thừa tất cả các field, property, method của base class. Được gọi đến tất cả các field, property, method có access modifier từ protected trở xuống.

Khi một class đính kèm một interface, class đó sẽ phải đính kèm tất cả các phương thức của interface đó. Nếu như đó không phải là abstract class thì class đó phải override lại tất cả các phương thức của base interface.

Abstract class là một loại class đặc biệt, bạn có thể vừa kế thừa vừa đính kèm. Kế thừa các field, non-abstract method, đính kèm các abstract method. Các method của interface đều là abstract method.

Trong C# thì kế thừa và đính kèm đều dùng ký hiệu “:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?