2012-03-04 2 views

답변

2

생성 된 코드에서 의도 한 확장 점이없는 것처럼 보입니다.

public partial class PreTextTemplate : PreTextTemplateBase 
{ 
    public virtual string TransformText() 
    { 
     this.Write("some text"); 
     return this.GenerationEnvironment.ToString(); 
    } 
} 

public class PreTextTemplateBase 
{ 
    protected StringBuilder GenerationEnvironment { get { … } set { … } } 

    public void Write(string textToAppend) 
    { 
     // code to write to GenerationEnvironment 
    } 
} 

그것은 this.Write()에 대한 호출은 기본 클래스에서 Write() 메소드를 호출하기위한 것입니다 분명하다 : 당신은 생성 된 코드를 보면, 그것은 다음과 같이 보입니다. 이렇게하면

public partial class PreTextTemplate 
{ 
    private readonly StreamWriter m_streamWriter; 

    public PreTextTemplate(StreamWriter streamWriter) 
    { 
     m_streamWriter = streamWriter; 
    } 

    public new void Write(string text) 
    { 
     m_streamWriter.Write(text); 
    } 
} 

TransformText()에 대한 호출이 실제로 인의 StreamWriter에 쓸 것입니다 :하지만 그 메소드를 호출 할 필요가 없습니다, 당신은 클래스의 이외의 생성 부분에 숨길 수 정확히 당신이 원하는.

실제로 Write() 메서드에 대한 코드는 생성 된 텍스트 (대부분 생성 된 텍스트의 들여 쓰기와 관련됨)가 수행 한 내용을 반영하기 위해 더 복잡 할 수 있습니다. 기본 클래스에는 Write()의 다른 오버로드도 포함되어 있습니다.이 오버로드도 마찬가지로 숨길 필요가 있습니다. 당신이 생성 Write()의 코드를 반영하지 않으려면

또는, 당신은 당신의 Write()base.Write()를 호출하여 스트림에 StringWriter의 내용을 작성하고 다음 StringWriter을 취소 할 수 있습니다. 그러나 당신은 여전히 ​​Write()의 모든 과부하를 다룰 필요가 있습니다.

+3

나는 사용자 지정 기본 클래스에서 다음을 사용하여 상속받을 수 있음을 발견했습니다. <# @ template language = "C#"inherits = "TemplateBase"#> 거기에 쓰기 메서드 등을 정의 할 수 있습니다. –

+0

당신이 맞습니다. 그것은 덜 해킹 된 해결책입니다. – svick

관련 문제