2012-09-11 2 views

답변

2

세터에는 protected을 지정할 필요가 없습니다. 그렇게하는 것은 좋은 디자인 일뿐입니다.

setter에 액세스 한정자가 지정되지 않은 경우 암시 적으로 해당 속성과 동일한 액세스 한정자 (사용자의 경우 public)가 있습니다. setter가 public이면 클래스의 모든 소비자가 Orders 속성을 수정하여 다른 인스턴스로 설정할 수 있습니다. 당신이 세터에 protected 액세스 한정자를 정의 할 때

public class Customer 
{ 
    public virtual IList<Order> Orders { get; set; } 
} 

var customer = new Customer(); 
customer.Orders = new List<Order>(); 

만 상속 클래스는 속성을 수정할 수 있습니다. 다른 소비자의 경우 Orders 속성은 읽기 전용으로 나타납니다. 이는 실질적으로 encapsulation입니다.

Hibernate는 기본적으로 lazy-loading을 사용합니다. 이것은 일부 속성 (일반적으로 목록)이 즉시로드되지 않지만 첫 번째 용도에서는 사용되는 기술입니다. NHibernate는 이것을 프록시로 구현한다. 동적으로 생성 된 프록시 클래스는 Entity 클래스에서 상속 받고 클래스의 모든 속성을 재정의합니다. 그것이 모든 반원들에게 virtual이 된 이유입니다.

protected set을 정의 할 때 NHibernate의 동적 프록시가 Orders 속성을 수정할 수 있도록 허용하고 있습니다. Orders은 일부 빈 프록시 콜렉션으로 초기화 될 수 있으며 누군가 읽으려고하면 데이터베이스로드가 트리거되고 Orders 등록 정보가 데이터베이스에서로드 된 Order 인스턴스 목록으로 바뀝니다.

public class Customer 
{ 
    public virtual IList<Order> Orders { get; protected set; } 
} 

var customer = new Customer(); 
//customer.Orders = new List<Order>(); // error: can't modify property 

var orderCount = customer.Orders.Count; // this will trigger lazy-loading