Odpowiedź jest nieco trudna. Odwrócona odpowiedź ma problem, StringBuilder nie ma żadnych wirtualnych metod. Więc nic nie można zrobić, aby przerwać klasy lub robi coś "extra" niebezpieczne.
Myślę, że prawdopodobną przyczyną jest to, że CLR ma specjalną wiedzę tej klasy. Jest to nieco przyziemne dla StringBuilder, w porównaniu do innych typów .NET, z którymi jest blisko, pinvoke marshaller wie, jak wygląda klasa. Używa się go, gdy trzeba przekazać referencję do kodu niezarządzanego, umożliwiając zapisanie treści ciągu. Konieczne, ponieważ nie jest to legalne dla String, jest niezmienne. Pinvoke marshaller wie, jak poprawnie ustawić wewnętrzne elementy StringBuilder po wywołaniu pinvoke. Ale nie wiedziałbym, jak to zrobić dla twojej pochodnej klasy. To ryzyko związane z krojeniem nie jest warte korzyści nieutrzymywania go. Zwłaszcza, że nie ma metod wirtualnych, więc nie można w ogóle nadpisać jego zachowania.
Metoda rozszerzająca jest poza tym bardzo rozsądnym rozwiązaniem.
Dlaczego trzeba obsługiwać zdarzenie "StringBuilder" TextChanged? To ty dodajesz do niego tekst. Zakładam, że względy wydajności przeważają nad jego rozszerzeniem. –
@Tim Co jeśli jest to 'StringWriter' lub jakaś natywna funkcja jak' SendMessage'? Ponadto lepiej jest pracować z wydarzeniami niż napisać kod typu 'void WriteToBuilder (StringBuilder sb, napis tekstowy)'. – KappaG3
["Projekt i dokument do dziedziczenia lub zakazaj go"] (http://martinfowler.com/bliki/DesignedInheritance.html) – dasblinkenlight