Как я могу представить состояние выполнения метода в базовом классе, не затрагивая реализацию в производных классах? - PullRequest
1 голос
/ 12 февраля 2010

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

public abstract class AbstractClass
    {
        public void Start()
        {
            ThreadStart ts = new ThreadStart(PerformWork);
            Thread t = new Thread(ts);
            t.Start();
            Thread.Sleep(2000);

            // Dependent on if ReportWork exited without expcetions
            // I want to call ReportSuccess or ReportFailure from this method.
            // However, I dont want to implement any reporting functionallity (or
            // as little as possible)
            // into the deriving classes PerformWork() method. Simply put
            // I want the deriving classes to be totally unaware of the reporting. 

        }

        public void ReportSuccess()
        {
            Console.WriteLine("Success!");
        }

        public void ReportFailure()
        {
            Console.WriteLine("Failure!");
        }
        public abstract void PerformWork();
    }

Класс, производный от AbstractClass:

class ConcreteImplementationClass:AbstractClass
    {
        public override void PerformWork()
        {
            // Implements some functionality
            // without knowing anything about
            // whats going on in AbstractClass.           
        }
    }

У кого-нибудь есть советы, как мне добиться этой функциональности или как создать нечто подобное?

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

Если я правильно понимаю, вы хотите позвонить ReportSuccess(), если PerformWork() успешно и ReportFailure(), если не получится?

Почему бы не изменить

public abstract void PerformWork();

до

public void Start()
{
    bool result = false;

    // This will enable Perform work to operate in its own thread
    Action threadAction = new Action(() =>
        {
            result = PerformWork();
        });

    ThreadStart ts = new ThreadStart(threadAction);
    Thread t = new Thread(ts);
    t.Start();
    Thread.Sleep(2000);

    // Dependent on if ReportWork exited without expcetions
    // I want to call ReportSuccess or ReportFailure from this method.
    // However, I dont want to implement any reporting functionallity (or
    // as little as possible)
    // into the deriving classes PerformWork() method. Simply put
    // I want the deriving classes to be totally unaware of the reporting. 

    if(result)
    {
        ReportSuccess();
    }
    else
    {
        ReportFailure();
    }
}
0 голосов
/ 12 февраля 2010

Вы описываете Аспектно-ориентированное программирование, АОП.

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

См. это ...

0 голосов
/ 12 февраля 2010

Разве вы не можете сделать ваш базовый метод виртуальным, учитывая, что вы хотите запустить в нем код, а затем вызвать base.PerformWork () во всех производных методах?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...