Làm thế nào để bạn thực hiện một setter riêng khi sử dụng một giao diện?


139

Tôi đã tạo một giao diện với một số thuộc tính.

Nếu giao diện không tồn tại, tất cả các thuộc tính của đối tượng lớp sẽ được đặt thành

{ get; private set; }

Tuy nhiên, điều này không được phép khi sử dụng giao diện, vậy điều này có thể đạt được không và nếu có thì như thế nào?

Câu trả lời:


266

Trong giao diện, bạn chỉ có thể xác định gettercho tài sản của mình

interface IFoo
{
    string Name { get; }
}

Tuy nhiên, trong lớp của bạn, bạn có thể mở rộng nó để có một private setter-

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}

1
Nó dường như không phàn nàn nếu setter là công khai ngay cả khi giao diện chỉ chứa một getter.
Mike Cheel

6
@MikeCheel Thats vì giao diện chỉ xác định các phương thức / bộ truy cập tối thiểu. Bạn có thể thêm nhiều hơn khi bạn sử dụng trực tiếp đối tượng. Mặc dù khi sử dụng một đối tượng làm kiểu giao diện, chỉ những phương thức / bộ truy cập được xác định trong giao diện mới có thể sử dụng được.
Marcello Nicoletti

29

Giao diện xác định API công khai. Nếu API công cộng chỉ chứa getter, thì bạn chỉ xác định getter trong giao diện:

public interface IBar
{
    int Foo { get; }    
}

Setter riêng không phải là một phần của api công khai (như bất kỳ thành viên riêng nào khác), do đó bạn không thể định nghĩa nó trong giao diện. Nhưng bạn có thể tự do thêm bất kỳ thành viên (riêng tư) nào để thực hiện giao diện. Trên thực tế, không quan trọng việc setter sẽ được triển khai ở chế độ công khai hay riêng tư, hoặc nếu có setter:

 public int Foo { get; set; } // public

 public int Foo { get; private set; } // private

 public int Foo 
 {
    get { return _foo; } // no setter
 }

 public void Poop(); // this member also not part of interface

Setter không phải là một phần của giao diện, vì vậy nó không thể được gọi qua giao diện của bạn:

 IBar bar = new Bar();
 bar.Foo = 42; // will not work thus setter is not defined in interface
 bar.Poop(); // will not work thus Poop is not defined in interface
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.