C>А нафига, собственно, без необходимости наследования?
Ну а зачем заводить лишний уровень абстракции, если можно без него обойтись?
Скажем, в случае автогенерации HTTP-клиента, это может выглядеть вот так:
// Client.generated.cs
partial class ApiClient {
public async Task SendRequest(HttpRequestMessage request) {
OnBeforeRequest(request);
// .. логика отправки запроса, получение ответа
OnAfterResponse(response);
}
partial void OnBeforeRequest(HttpRequestMessage request);
partial void OnAfterResponse(HttpRequestMessage response);
}
// И это дает возможность простой кастомизации запросов/ответов
// Client.Customization.cs
partial class ApiClient {
partial void OnBeforeRequest(HttpRequestMessage request) {
request.Headers.Add("X-Header", "SomeValue");
}
}
Или взять другой пример — редактор форм в WinForms/WPF.
// MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// Здесь располгается наш код (обработчики событий и т.п.)
}
// MainWindow.g.i.cs - автосгенерированый файл
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
// Здесь куча автосгенерированного кода по созданию, инициализации, настройке, позиционированиию компонентов,
// которые мы мышкой накидали в визуальном редакторе
}