Как использовать generic для доступа к методу
От: danshar  
Дата: 16.02.06 08:59
Оценка:
Всем привет! Стоит C# из VS 2005.
Возник вопрос, как обратится к методу/свойству типа T в шаблонном классе?
    public class Mediator<T>
    {
        private ArrayList _arrModuleList=new ArrayList();
        public Mediator() {}
        public void sendMessage(CustomCommand cmd){
          
            foreach (T am in _arrModuleList)
                        am.executeCmd(cmd); //ВЫДАЕТ ПРИ КОМПИЛЯЦИИ ОШИБКУ: 'T' does not contain a definition for 'executeCmd'
                        
        }
        //добавление (регистрация) модуля в массив модулей
        public void addModule(T am)
        {
            _arrModuleList.Add(am);
        }
    }

Заранее спасибо за помощь.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: Как использовать generic для доступа к методу
От: Maratovna  
Дата: 16.02.06 09:03
Оценка:
Здравствуйте, danshar, Вы писали:

D>Всем привет! Стоит C# из VS 2005.

D>Возник вопрос, как обратится к методу/свойству типа T в шаблонном классе?

D>Заранее спасибо за помощь.

Неоходимо при обяслении указать Constraints — уточнения, какие интерфейсы поддерживает класс T, либо от какого класса отнаследован и имеет ли открытый конструктор без параметров. В спецификации всё есть.
Re: Как использовать generic для доступа к методу
От: ie Россия http://ziez.blogspot.com/
Дата: 16.02.06 09:07
Оценка: 2 (1) +1
Здравствуйте, danshar, Вы писали:

D>Всем привет! Стоит C# из VS 2005.

D>Возник вопрос, как обратится к методу/свойству типа T в шаблонном классе?

Шаблоны из С++ и дженерики разные вещи. Можно сделать так:

    public interface IExecutable
    {
        void executeCmd(CustomCommand cmd);
    }

    public class Mediator<T>
        where T : IExecutable
    {
        private List<T> _arrModuleList = new List<T>();

        public void sendMessage(CustomCommand cmd)
        {
            foreach (T am in _arrModuleList)
                am.executeCmd(cmd); 
        }
        public void addModule(T am)
        {
            _arrModuleList.Add(am);
        }
    }


При этом все ваши модули должны реализовывать интерфейс IExecutable.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Превратим окружающую нас среду в воскресенье.
Re: Как использовать generic для доступа к методу
От: Tiarod Украина  
Дата: 16.02.06 09:08
Оценка: 2 (1)
Здравствуйте, danshar, Вы писали:
public class TBase
{
    public void executeCmd(CustomCommand cmd) {}
}

D>Возник вопрос, как обратится к методу/свойству типа T в шаблонном классе?
D>
D>    public class Mediator<T> where T:TBase
D>    {
D>        private ArrayList _arrModuleList=new ArrayList();
D>        public Mediator() {}
D>        public void sendMessage(CustomCommand cmd){
          
D>            foreach (T am in _arrModuleList)
D>                        am.executeCmd(cmd);
                        
D>        }
D>        //добавление (регистрация) модуля в массив модулей
D>        public void addModule(T am)
D>        {
D>            _arrModuleList.Add(am);
D>        }
D>    }
D>

D>Заранее спасибо за помощь.
Re: Как использовать generic для доступа к методу
От: VladGalkin Украина  
Дата: 16.02.06 09:09
Оценка: 2 (1)
Здравствуйте, danshar, Вы писали:

D>
D>    public class Mediator<T>
D>    {
D>        private ArrayList _arrModuleList=new ArrayList();
D>        public Mediator() {}
D>        public void sendMessage(CustomCommand cmd){
          
D>            foreach (T am in _arrModuleList)
D>                        am.executeCmd(cmd); //ВЫДАЕТ ПРИ КОМПИЛЯЦИИ ОШИБКУ: 'T' does not contain a definition for 'executeCmd'
                        
D>        }
D>        //добавление (регистрация) модуля в массив модулей
D>        public void addModule(T am)
D>        {
D>            _arrModuleList.Add(am);
D>        }
D>    }
D>

Завести интерфейс IModule c методом executeCmd и наложить сonstrain на generic в классе Mediator:
using System.Collections.Generic; // Лучше так


public class Mediator<T>
                where T : IModule
{
        private List< T > _arrModuleList = new new List< T >();
        
            
        public void sendMessage( CustomCommand cmd )
        {
          
                foreach (T am in _arrModuleList)
                {
                        am.executeCmd(cmd); 
                }                        
        }
}
... << RSDN@Home 1.1.4 stable rev. 510>>
ДЭ!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.