Trình truy cập nhiều hơn trường. Những người khác đã chỉ ra một số khác biệt quan trọng, và tôi sẽ thêm một số khác nữa.
Thuộc tính tham gia vào các lớp giao diện. Ví dụ:
interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
Giao diện này có thể được thỏa mãn theo nhiều cách. Ví dụ:
class Person: IPerson
{
private string _name;
public string FirstName
{
get
{
return _name ?? string.Empty;
}
set
{
if (value == null)
throw new System.ArgumentNullException("value");
_name = value;
}
}
...
}
Thực hiện điều này, chúng tôi đang bảo vệ cả hai lớp Person
từ đi vào một trạng thái không hợp lệ, cũng như người gọi từ nhận rỗng ra khỏi bất động sản không được gán.
Nhưng chúng tôi có thể đẩy thiết kế thêm nữa. Ví dụ, giao diện có thể không đối phó với setter.Đó là hoàn toàn hợp pháp để nói rằng người tiêu dùng của giao diện IPerson
chỉ quan tâm đến nhận tài sản, không đặt nó:
interface IPerson
{
string FirstName { get; }
string LastName { get; }
}
thực hiện trước của Person
đáp ứng lớp giao diện này. Thực tế là nó cho phép người gọi cũng thiết lập các thuộc tính là vô nghĩa từ quan điểm của người tiêu dùng (người tiêu thụ IPerson
). chức năng bổ sung việc thực hiện cụ thể được đưa vào xem xét bằng cách, ví dụ, xây dựng:
class PersonBuilder: IPersonBuilder
{
IPerson BuildPerson(IContext context)
{
Person person = new Person();
person.FirstName = context.GetFirstName();
person.LastName = context.GetLastName();
return person;
}
}
...
void Consumer(IPersonBuilder builder, IContext context)
{
IPerson person = builder.BuildPerson(context);
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
Trong mã này, người tiêu dùng không biết về setters tài sản - nó không phải là kinh doanh của mình để biết về nó. Người tiêu dùng chỉ cần getters, và anh ta nhận được getters từ giao diện, tức là từ hợp đồng.
Một thực hiện hoàn toàn hợp lệ IPerson
sẽ là một lớp người bất biến và một nhà máy người tương ứng:
class Person: IPerson
{
public Person(string firstName, string lastName)
{
if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName))
throw new System.ArgumentException();
this.FirstName = firstName;
this.LastName = lastName;
}
public string FirstName { get; private set; }
public string LastName { get; private set; }
}
...
class PersonFactory: IPersonFactory
{
public IPerson CreatePerson(string firstName, string lastName)
{
return new Person(firstName, lastName);
}
}
...
void Consumer(IPersonFactory factory)
{
IPerson person = factory.CreatePerson("John", "Doe");
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
Trong mẫu tiêu dùng mã một lần nữa không có kiến thức về làm đầy các thuộc tính. Người tiêu dùng chỉ thỏa thuận với getters và thực hiện cụ thể (và logic kinh doanh đằng sau nó, như kiểm tra nếu tên là trống) là trái để các lớp học chuyên ngành - nhà xây dựng và nhà máy. Tất cả các hoạt động này hoàn toàn không thể thực hiện được với các trường.
bản sao có thể có của [Getters và setters được triển khai tự động so với các trường công khai] (http://stackoverflow.com/questions/111461/auto-implemented-getters-and-setters-vs-public-fields) – nawfal