Всем привет! Стоит 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>>
Здравствуйте, 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>>
Здравствуйте, 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>Заранее спасибо за помощь.
Здравствуйте, 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>>