Короткий ответ здесь сначала, я собираюсь написать в блоге об этом, спасибо за идею!
Итак, давайте предположим, что у нас есть это:
class PresenterAndController
{
public void Control()
{
Present();
}
public void Present()
{
// present something
}
}
Сначала нам нужно преобразовать все прямые использования членов в косвенные, то есть квалифицировать их полем. Для этого используйте рефакторинг экстракта суперкласса для извлечения части Presenter в суперкласс:
internal class Presenter
{
public void Present()
{
// present something
}
}
class PresenterAndController : Presenter
{
public void Control()
{
Present();
}
}
Создайте поле в PresenterAndController, которое будет делегировать одно, и используйте Generate (Alt-Ins) для создания делегирующих членов. Они будут скрывать базовые методы, так как они одинаковы:
internal class Presenter
{
public void Present()
{
// present something
}
}
class PresenterAndController : Presenter
{
private Presenter myPresenter;
public void Present() // hides base method
{
myPresenter.Present();
}
public void Control()
{
Present(); // it now references method from this type
}
}
Удалите Presenter из списка наследования, и все готово для разделения классов. Теперь вы можете извлекать интерфейсы, использовать базовые типы, где это возможно, и в противном случае приводить их в порядок.