Похоже, ваш вопрос в чем разница между
partial class Foo
{
PART ONE
}
partial class Foo
{
PART TWO
}
и
astract class FooBase
{
PART ONE
}
partial class Foo : FooBase
{
PART TWO
}
Хотя они могут показаться чем-то похожими, и в некоторых случаях последняя конструкция может использоваться вместо первой, с последним стилем есть как минимум две проблемы:
-1- Тип FooBase
, вероятно, должен был бы знать идентичность конкретного типа, который должен был быть его производным, и всегда использовать переменные этого типа, а не типа FooBase
. Это представляет собой неудобно тесную связь между двумя типами.
-2- Если тип Foo
является открытым, тип FooBase
также должен быть открытым. Даже если все конструкторы FooBase
равны internal
, внешний код мог бы определять классы, производные от FooBase
, но не Foo
; создание экземпляров таких классов было бы сложно, но не невозможно.
Если бы у производного типа была возможность расширить видимость базового типа, эти проблемы не были бы чрезмерно проблематичными; можно было бы считать FooBase
«одноразовым» идентификатором, который будет появляться ровно дважды: один раз в его объявлении и один раз в строке объявления для Foo
, и считать, что каждый FooBase
будет замаскированным Foo
. Тот факт, что FooBase
не может использовать Foo
членов экземпляра на this
без трансляции типов, может быть утомительным, но также может способствовать хорошему разбиению кода. Однако, поскольку невозможно расширить видимость базового типа, дизайн абстрактного класса выглядит странно.