Использование индексаторов
От: Ilya_  
Дата: 20.11.02 16:37
Оценка:
Подскажите пожалуйста:

есть класс с двумя списками(ArrayList), хотелось бы получать доступ к спискам через индексаторы,
пока придумалось вот что:


public DrawObject this[int pos, bool model]
{
 get
 {
  if(model) {}
  else {}
 }

 set {...}
}


bool можно заменить на enum, if/else соотв. на switch

Можно еще каким-либо образом решить проблему.

Спасибо
Re: Использование индексаторов
От: der Igel Россия  
Дата: 20.11.02 16:47
Оценка: 3 (1)
Здравствуйте, Ilya_, Вы писали:

I>Подскажите пожалуйста:


I>есть класс с двумя списками(ArrayList), хотелось бы получать доступ к спискам через индексаторы,

I>пока придумалось вот что:

...

I>Можно еще каким-либо образом решить проблему.


Помоему индексатору только один параметер можно передать.

Так что можно так...

class Param
{
  public Param(int pos, bool model)
  {
    this.pos = pos;
    this.model = model;
  }
  public int  pos;
  public bool model;
}

public DrawObject this[Param param]
{
 get
 {
  if(param.model) {}
  else {}
 }

 set {...}
}

...
DrawObject obj...
obj[new Param(5, true)] = ....
...
Re: Использование индексаторов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 20.11.02 16:53
Оценка: 3 (1)
Здравствуйте, Ilya_, Вы писали:

I>Можно еще каким-либо образом решить проблему.


Можно ввести дополнительные классы-пустышки:
1 вариант

public class FirstDummyClass{}
public class SecondDummyClass{}

public DrawObject this[int pos, FirstDummyClass model]{}

public DrawObject this[int pos, SecondDummyClass model]{}


2 вариант:
public class FirstDummyClass
{
  public FirstDummyClass(int index)
  {
    this.index = index;
  }
  public int index;
  
}
public class SecondDummyClass{}

public DrawObject this[FirstDummyClass pos]
{
  get{return (DrawObject)firstArrayList[pos.index];}
}

public DrawObject this[SecondDummyClass pos]{}

3 вариант:
сделать разное кол-во параметров
public DrawObject this[int pos]{} //индексация по одному параметру

public DrawObject this[int pos, bool dummyParameter]{}//это по другому параметру
Re[2]: Использование индексаторов
От: Ilya_  
Дата: 20.11.02 17:09
Оценка:
Здравствуйте, DarkGray, Вы писали:

[skip]

DG>2 вариант:

DG>[c#]
DG>public class FirstDummyClass
DG>{
DG> public FirstDummyClass(int index)
DG> {
DG> this.index = index;
DG> }
DG> public int index;
DG>
DG>}
DG>public class SecondDummyClass{}

DG>public DrawObject this[FirstDummyClass pos]

DG>{
DG> get{return (DrawObject)firstArrayList[pos.index];}
DG>}

Спасибо, я об этом не подумал.

В вашем варианте, добавляются два класса, которые нужны только для выбора нужного списка, при добавлении еще одного списка(не ожидается, но вдруг ), придется добавлять еще один класс, и т.д.
При использовании перечисления мы получаем громоздкий switch.

Хотелось бы узнать ваше мнение, что лучше с точки зрения дизайна && производительности (дизайна || производительности)

Спасибо.
Re[3]: Использование индексаторов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 20.11.02 17:21
Оценка:
Здравствуйте, Ilya_, Вы писали:

I>В вашем варианте, добавляются два класса, которые нужны только для выбора нужного списка, при добавлении еще одного списка(не ожидается, но вдруг ), придется добавлять еще один класс, и т.д.


С точки зрения дизайна — это не страшно, так как по трудоемкости равно варианту с enum-ом.

I>При использовании перечисления мы получаем громоздкий switch.


I>Хотелось бы узнать ваше мнение, что лучше с точки зрения дизайна && производительности (дизайна || производительности)


Я бы остановился бы на втором своем варианте (только DummyClass-ы заменил бы на структуры), т.к. по дизайну это самое хорошее решение, а по производительности должно быть сравнимо со switch-овым вариантом (причем в лучшую или худшую сторону — сейчас не понятно, надо смотреть)
Re[2]: Использование индексаторов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 20.11.02 17:23
Оценка:
DI>Помоему индексатору только один параметер можно передать.

Не правда, индексатор берет произвольное кол-во параметров
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.