Абстрактные классы или частичные? - PullRequest
3 голосов
/ 08 марта 2012

У меня есть ряд задач, которые могут выполняться аналогичными (но немного отличающимися) классами, которые имеют общий набор функций.

Мое намерение состоит в том, чтобы извлечь эту функциональность в родительский класс, и поскольку я не хочу, чтобы это реализовывалось само, я пометил ее abstract.

Однако все вызывающие классы вызывают один метод - который содержал извлеченную общую функциональность. Я не хочу override метод родительского класса, но я хочу, чтобы он выполнялся в дополнение к тому, что определено в дочернем классе.

Сначала я думал, что это работа для частичного метода, но я думаю, что это несколько нарушит семантику. Так какой же лучший путь для меня? Испытываете немного туннельного видения здесь.

Ответы [ 4 ]

8 голосов
/ 08 марта 2012

Вы можете сделать это так:

public abstract class Parent
{
    public void TheSingleMethod()
    {
        CommonFunctionality();

        InternalDo();
    }

    protected abstract void InternalDo();

    private void CommonFunctionality()
    {
        // Common functionality goes here.
    }
}

public class Derived : Parent
{
    protected override void InternalDo()
    {
        // Additional code of child goes here.
    }
}
1 голос
/ 08 марта 2012

Похоже, вам нужен Шаблонный метод

Например

abstract class BaseClass {
    public void Common Method() {
        // Common tasks

        // Call template method
        this.SubclassSpecificMethod();

        // Can also do more code after the call to the template method
    }

    protected abstract void SubclassSpecificMethod();
}
0 голосов
/ 08 марта 2012

Вы также можете сделать:

abstract class BaseClass
{
    public void Method() {
        // Common tasks
    }
}

class RealClass : BaseClass 
{
    public void Method() {
         base.Method();
         // custom tasks for this class
    }
}
0 голосов
/ 08 марта 2012

Похоже на композицию и Шаблон декоратора может быть еще одним вариантом для вас.

...