2011-09-22 5 views
4

나는 상속하고 싶은 클래스가있다. ExpenseForm은 스프레드 시트에서 상속해야합니다. 스프레드 시트는 제 3자가 제공합니다. 변경할 수 없습니다.클래스를 상속 받지만 대개 정적 메서드로 생성됩니까?

그러나 부모 클래스의 인스턴스는 일반적으로 정적 방법으로 생성됩니다

Spreadsheet myExpenses = Spreadsheet.Open(filename); 

(그리고 스프레드 시트는 IDisposable을 구현, 그래서 위의 문이 사용 섹션 상단에 실제로,하지만 난 생각하지 않습니다 정말이 영향을 미칩니다.)

내가 스프레드 시트에서 상속 ExpenseForm.Open()가 SPR을 반환하기 때문에, 물론,

ExpenseForm myExpenses = ExpenseForm.Open(filename); 

이 실패 갖고 싶습니다 eadsheet 개체.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 어쩌면 확장 방법일까요? (나는 그 경험이 없다.)

나는 다른 방향으로 갔다. ExpenseForm에는 이제 스프레드 시트의 인스턴스가 있습니다. (일을 끝낼 때 정리할 일회용 객체를 추적해야하기 때문에 좀 더 복잡해집니다.)하지만 원래 상속 문제를 해결할 방법이없는 것처럼 보입니다.

+0

SpreadSheet의 파생물이 아닌 것 같습니다. 당신의 장소에서 나는 그것을 ExpenseForm의 속성으로 만들 것입니다. –

답변

1

그럼 당신은 충분히 쉽게 자신의 ExpenseForm.Open 방법을 만들 수 있습니다 : 당신이 서브 클래스를 생성 할 수 있습니다 가정 것

public static new ExpenseForm Open(string file) 
{ 
    // Do whatever you need 
} 

, 당신이 할 수있는 체인에 적절한 생성자가 즉 것을. 은 일반적으로입니다. Spreadsheet.Open을 사용하지만 입니다. protected 또는 public 생성자가 있습니까?

개인적으로 나는 어쨌든 합성 경로를 선호 할 것입니다. 다른 코드가 인 것처럼 실제로 다른 코드가 Spreadsheet 인 것처럼 처리하고 싶습니까? 저는 일반적으로 상속보다 더 많은 구성 요소를 사용합니다. 코드를 사용하면 내 경험에 비추기가 쉽습니다.

+0

인수가없는 단일 보호 된 생성자가 있지만 더 자세히 조사하고 해당 경로를 통과하면 모든 것을 적절히 초기화 할 수 있는지 확인해야합니다. (MS 오피스 OpenXML SDK 클래스입니다. 내가하고있는 것을 위해, 모든 스프레드 시트 기능을 객체에 직접 가져 오는 것이 좋을 것이라고 생각하지만, 언제든지 ExpenseForm.UnderlyingSpreadsheet를 노출 할 수 있습니다.) –

1

Spreadsheet 개체는 정적 함수를 통해서만 만들 수 있으며 상속은 옵션이 아닙니다. 그런 종류의 객체를 반환하는 ExpenseForm 내에 자신의 Open 정적 함수를 제공하기 만하면됩니다.

+0

+1 : 답변을 하나만 수락 할 수 있습니다. 도와 주셔서 감사합니다. –

관련 문제