Chủ Nhật, ngày 06 tháng 5 năm 2012

// // Leave a Comment

Vấn đề Explicit Interface C#

 Khi cài một hoặc nhiều interface theo cách khai báo tường minh (explicit implimentation), thì mặc nhiên các thành viên trong lớp đó có mức độ truy cập (access modifier) được đặt là private. Và khi đó ta không thể thêm hoặc thay đổi chúng.

 Ví dụ một trường hợp với thông báo lỗi của trình biên dịch là: The modifier 'public' is not valid for this item

namespace Test.InterfaceLib
{

    public class Customer : IMember
    {
        public string IMember.PrintName() //Error Here...
        {
            return this.GetType().Name + " called from interface i1";
        }
    }

    public interface IMember
    {
        string PrintName();
    }

    interface IUser
    {
        string PrintName();
    }
}

Giống như trong khi định interface, tất cả các thành viên của nó mặc định là public. Nếu cố add thêm 1 từ khóa (private, public, protected, internal) là điều không hợp lệ và ta gặp một lỗi tương tự như trên.

Vậy thì tại sao các thành viên của lớp khi cài đặt explicit lại mặc định là private. Xem ví dụ sau:


namespace Test.InterfaceLib
{
    interface I1 { void PrintName();    }
    interface I2 { void PrintName();    }

    public class Customer : I1, I2
    {
        void I1.PrintName()
        {
            Console.WriteLine("I1");
        }

        void I2.PrintName()
        {
            Console.WriteLine("I2");
        }
    }
}

Trường hợp 1: Gặp lỗi, không biết gọi phương thức nào

            Customer c = new Customer();
            c.PrintName();

Trường hợp 2: Hợp lệ khi lời gọi là tường minh

            Customer c = new Customer();
            (c as I1).PrintName();

Như vậy, nếu có các phương thức là public, có thể bạn gặp phải xung đột các tên với nhau (name-clash) và không thể xử lý được bằng các qui tắc quá tải thông thường (overloading).

0 comments: