Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как расширить свой класс методами класса Thread?


Автор: alir 6.12.2005, 19:14
Как расширить свой класс методами класса Thread?
Пытался наследовать от Thread, но нельзя, так как он является sealed классом.
Может существует интрефейс, содержащий методы Thread, чтоб можно было наследовать от него (как в java - Runnuble)?

Как решить задачу?

Автор: arilou 6.12.2005, 19:21
Цитата(alir @ 6.12.2005, 19:14)
Как решить задачу?

А что за задача?

Автор: alir 6.12.2005, 19:33
Цитата
А что за задача?

Долго расскзывать. Все свелось к задаче создания класса, который содержит свои методы и переменные, а также методы класса Thread. Дополню сказанное лишь тем, что необходимы два метода класса Thread: suspend и resume.
Как это сделать?

Автор: arilou 6.12.2005, 19:50
Цитата(alir @ 6.12.2005, 19:33)
Все свелось к задаче создания класса, который содержит свои методы и переменные, а также методы класса Thread

Вот если честно, не могу себе представить такой задачи, потому что класс Thread не просто так сделан sealed.

Если нужно сделать, чтобы у класса был метод, выполняющийся в отдельном потоке, а класс предоставлял возможность приостановить и запустить заново его работу, то это можно сделать так:

Код

public class MyAsyncClass
{
    Thread _thread = null;

    /// <summary>
    /// Приостанавливает выполнение
    /// </summary>
    public void Suspend()
    {
        if(_thread != null && _thread.ThreadState == ThreadState.Running)
        {
            _thread.Suspend();
            // ждем, пока поток остановится
            while(_thread.ThreadState == ThreadState.SuspendRequested); 
        }
    }

    /// <summary>
    /// Продолжает выполнение
    /// </summary>
    public void Resume()
    {
        if(_thread != null && _thread.ThreadState == ThreadState.Suspended)
        {
            _thread.Resume();
            // ждем, пока поток перейдет в состояние Running
            while(_thread.ThreadState != ThreadState.Running); 
        }
    }

    public MyAsyncClass()
    {
        _thread = new Thread(new ThreadStart(startMyOperationImpl));
    }

    /// <summary>
    /// Собственно сама операция
    /// </summary>
    private void startMyOperationImpl()
    {
    }

    /// <summary>
    /// Запускаем асинхронную операцию (public метод-обертка)
    /// </summary>
    public void StartMyOperation()
    {
        _thread.Start();
    }
}


Код не запускал, но все должно работать. При известном желании можно сделать так, что класс будет работать с любым потоковым методом (не только со своим).

Автор: alir 6.12.2005, 19:58
arilou
Цитата
Вот если честно, не могу себе представить такой задачи, потому что класс Thread не просто так сделан sealed.

А вот про причины я бы почитал.

Автор: arilou 6.12.2005, 20:02
Цитата(alir @ 6.12.2005, 19:58)
А вот про причины я бы почитал

Класс Thread - это wrapper вокруг API'шных ф-ций по управлению потоками. Нецелесообразно давать возможность изменять его поведение (через наследование), потому что это может привести к непредсказуемым рез-татам.

Задачи, которые нельзя решить с пом.наследования, решаются с помощью аггрегации (как в моем примере).

Автор: mr.DUDA 7.12.2005, 08:56
Цитата(arilou @ 6.12.2005, 19:02)
потому что это может привести к непредсказуемым рез-татам.

если руки не кривые, то и результаты будут предсказуемые, ИМХО

Автор: arilou 7.12.2005, 14:03
Цитата(mr @ 7.12.2005, 08:56)
если руки не кривые, то и результаты будут предсказуемые, ИМХО

Согласен, но ты же не делаешь допущение, что у всех программистов не кривые руки ;) Вот и они не делают... smile

Автор: alir 7.12.2005, 18:34
Цитата
класс Thread не просто так сделан sealed.

Java вот например разрешает наследовать класс Thread. smile

Автор: arilou 7.12.2005, 18:42
Цитата(alir @ 7.12.2005, 18:34)
Java вот например разрешает наследовать класс Thread

Ну и что smile Так задачу твою мы решили или нет? Если нет, то будет не лишним тебе постараться и описать ее подробнее, если действительно нужно помощь.

Автор: mr.DUDA 7.12.2005, 23:53
Есть такой паттерн, называется decorator, aka wrapper:

Цитата
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.


Объект класса Thread включается в качестве поля в класс MyThread, который выставляет наружу свои методы - такие же по сигнатуре, как и у Thread (они перенаправляют вызов к Thread-полю класса MyThread), а также дополнительные методы - те, которые необходимы для решения наших собственных задач.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)