2012-03-30 9 views
1

우리는 코드를 생성하는 유틸리티를 사용합니다. 확장하고 코드 생성기로 돌아 가지 않고도 할 수있을 것이라고 생각했습니다. 여기에 문제가있다.기반에서 보호 된 메서드를 호출하는 파생 클래스에 확장 메서드를 추가 할 수 있습니까?

코드 생성기는 저를 제공합니다

public abstract class BaseService 
{ 
    protected virtual SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows); 
    protected DataSet Fill(SqlCommand command); 
} 

는 그 다음이 클래스를 구현하는 클래스를 많이 생성합니다. 예 :

public class ChildService : BaseService 
{ 
    protected override SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows) 
    { 
     //implementation here 
    } 

    protected override SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows) 
    { 
     //implementation here 
    } 

    public virtual DataSet Select(string whereClause, System.Collections.Hashtable parameters, string orderClause, int maxRows) 
    { 
     SqlCommand command = CreateSelectCommand(whereClause, parameters, orderClause, maxRows); 
     return Fill(command); 
    } 
} 

이제 모든 자식 클래스를 확장하여 Select 메서드를 재정의했습니다. 이 같은 확장 메서드 뭔가 시도 :

public DataSet Select(this BaseService service, string whereClause, Hashtable parameters, string orderBy, int startRowIndex, int maximumRows) 
{ 
     SqlCommand command = service.CreateSelectCommand(whereClause, parameters, orderClause, maxRows); 
     //Modify the command here 
     return service.Fill(command); 
} 

을하지만 서비스 매개 변수는 자식 클래스의 인스턴스가 아닌 그래서 방법을 보호 CreateSelectCommand에 액세스 기입 할 수 없기 때문에 컴파일러는 불평. 이 문제를 해결할 수있는 방법이 없으므로 모든 하위 클래스에서이를 구현할 필요가 없습니다.

+0

확장 메서드 대신 생성 된 기본 클래스에 추가 메서드를 추가하기 위해 부분 클래스를 사용하지 않는 이유가 있습니까? –

+0

좋은 생각이지만 모든 부분이 부분 키워드를 사용해야하기 때문에 넘어 질 것이라고 생각합니다. – Colin

답변

6

이 문제를 해결할 수있는 방법이 없으므로 모든 하위 클래스에서이를 구현할 필요가 없습니까?

아니요, 없습니다.

확장 방법은 (인텔리 마법으로) 표시 정적 클래스에 정적 메소드는 유형 "속하는"한다. 즉, 유형은 과 정확히 일치해야합니다 (하나의 경우에만)입니다.

또한 이 아닌이 유형에 속하며 해당 유형에 선언 된 보호 된/전용 멤버에 액세스 할 수 없음을 의미합니다.

3

아니요. 확장 방법은 완전히 작동하는 클래스의 외부에 있습니다. 보호 된 메서드에 액세스 할 수있는 유일한 장소는 클래스 자체 (또는 중첩 된 내부 클래스) 또는 해당 클래스를 상속하는 다른 클래스에 있습니다.

덧붙여, 당신은 전혀 확장 방법을 사용하여 재정의를 제공하지 않습니다 ...

1

번호 확장 메서드는 정적 메소드 호출에 대한 문법 설탕입니다. 액세스 가능성 측면에서 확장 메소드의 규칙은 정적 메소드의 규칙과 동일합니다. 정적 메서드는 protected과 같은 항목을 위반할 수 없으므로 확장 메서드를 사용할 수 없습니다.

관련 문제