우리는 코드를 생성하는 유틸리티를 사용합니다. 확장하고 코드 생성기로 돌아 가지 않고도 할 수있을 것이라고 생각했습니다. 여기에 문제가있다.기반에서 보호 된 메서드를 호출하는 파생 클래스에 확장 메서드를 추가 할 수 있습니까?
코드 생성기는 저를 제공합니다
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에 액세스 기입 할 수 없기 때문에 컴파일러는 불평. 이 문제를 해결할 수있는 방법이 없으므로 모든 하위 클래스에서이를 구현할 필요가 없습니다.
확장 메서드 대신 생성 된 기본 클래스에 추가 메서드를 추가하기 위해 부분 클래스를 사용하지 않는 이유가 있습니까? –
좋은 생각이지만 모든 부분이 부분 키워드를 사용해야하기 때문에 넘어 질 것이라고 생각합니다. – Colin