Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Có thể khởi tạo phương thức ngoài get, set cho indexer C# hay ko?

21:04 26-01-2018 993 lượt xem 1 bình luận 23:14 26-01-2018

Chào anh chị ạ,

Sao bao ngày mòm hỏi em cũng hiểu hiểu được chút về C# và đang thực hành ^^

Tuy nhiên em cũng có 1 vài vướng mắt và cũng có thử google, nhưng chắc do em google ngu quá nên ko ra result nào như ý muốn nên đem lên đây hỏi, hơi ngố ngố mong anh chị giúp đỡ ^^

Số là giả sử em có class Book và trong class Book em có indexer. Có cách nào khởi tạo các phương thức cho indexer đó ko ạ. Em ví dụ:

Book list = new Book();
list[0].Show(); // phương thức Show() cho indexer
list.Show(); // phương thức Show() cho class Book bình thường ko có indexer

 

Bổ xung

Em mới ngồi nghĩ ra 1 cách mà có lẽ (hoặc do em nghĩ) hơi ngố.

Em định get, set indexer về cho 1 class khác, rồi class này có phương thức show riêng thì list[0] chính là class đó (giả sử Book2 chẳng hạn) rồi nó mặc nhiên có các phương thức của nó.

Như thế được ko anh chị? Em cảm giác hơi trẻ con @@

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Anh Thư đã bình luận 23:13 26-01-2018

Indexer chỉ dùng cho các class theo dạng Container hoặc Collection. C# cung cấp các Container class thường dùng như List, Stack, Queue, Dictionary.

Trong trường hợp của em thì Book không phải là Container. Do đó không nên dùng Indexer, nó gây khó khăn khi người đọc đoán ý nghĩa của Indexer của em viết thực hiện những gì.

Thay vì dùng Indexer, em có thể viết 2 method Get<<Property>> và Set<<Property>> tường minh để thao tác, hoặc tạo nested class và dùng Indexer cho nested class.

Ví dụ: Trong Book có mục lục, chia thành từng chương (chapter).

Nếu dùng method: em tạo 2 method như sau:

public class Book
{
    public List<BookChapter> Chapters { get; set; }

    Book(List<BookChapter> chapters)
    {
        Chapters = chapters;
    }

    public BookChapter GetChapter(int position)
    {
        return Chapters[position];
    }

    public void SetChapter(int position, BookChapter chapter)
    {
        Chapters[position] = chapter;
    }
}

Nếu dùng nested class + indexer, như sau:

public class Book
{
    public class ChapterList
    {
        public string[] Title { get; set; }

        public this[int index]
        {
            get => Title[index];
            set => Title = value;
        }
    }

    private ChapterList chapters;

    public List<string> Chapters
    {
        get => chapters.Title;
        set => chapters.Title = value;
    }
}

var book = new Book();
var firstChapter = book.Chapters[0];

 

Câu hỏi mới nhất