Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Аноним, Вы писали:
[skipped]
много казуистики.
конкретные вещи:
есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс.
Я не могу вставить вилку 220 в 360.
Считай, что метод Add это вставки вилки в розетку
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, samius, Вы писали:
А>>>>кто мне объяснит зачем мне доступен метод Add, который всегда будет кидать эксепшн? Q>>>«Framework Design Guidelines», глава «9.7 Optional Feature Pattern». S>>Есть рецепт, как можно понять, можно ли вызывать метод IList<T>.Add без получения исключения и даункастинга?
_FR>В этом суть паттерна и заключена, что на все подобные кейсы "есть рецепт". Подробнее ознакомиться можно здесь.
Хорошо, как понять можно ли использовать индексатор списка на запись?
А>конкретные вещи: А>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс. А>Я не могу вставить вилку 220 в 360. А>Считай, что метод Add это вставки вилки в розетку
Приведение массива к интерфейсу это использование переходника для вилки. С переходником вставить сможешь.
Здравствуйте, Аноним, Вы писали:
А>[skipped] А>много казуистики.
То есть по сути вам ответить таки нечего
А>конкретные вещи: А>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс. А>Я не могу вставить вилку 220 в 360. А>Считай, что метод Add это вставки вилки в розетку
А кто вам _обещал_ какую-то конкретную розетку или вилку? Чем одна розетка\вилка лучше другой? Ничем, они равноправны. А переходники у любого _квалифицированного_ путешественника должны быть в наличии. Из приведённого вами примера виднен лишь недостаток квалификации
Продолжайте, весилите публику в том же духе.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, samius, Вы писали:
A>>Без множественного наследования — нельзя. S>И для чего оно тут?
Потому что иначе получишь комбинаторный рост количества реализаций от количества интерфейсов. enumerable/readonly/resizable — это три разных признака. И тебе надо сделать какую-то системную реализаую для колелкции размер которой менять нельзя, но можно менять элементы. Без множественного наследования будешь выписывать все варианты копипейстом. Можно привести фундаментальный и более просотой пример — System.Stream vs. istream/ostream.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, samius, Вы писали:
A>>>Без множественного наследования — нельзя. S>>И для чего оно тут?
A>Потому что иначе получишь комбинаторный рост количества реализаций от количества интерфейсов. enumerable/readonly/resizable — это три разных признака. И тебе надо сделать какую-то системную реализаую для колелкции размер которой менять нельзя, но можно менять элементы.
Из них массив является лишь enumerable. В чем проблема? Где взрыв? Где множественное наследование?
A>Без множественного наследования будешь выписывать все варианты копипейстом. Можно привести фундаментальный и более просотой пример — System.Stream vs. istream/ostream.
Напомню, мы говорим о коллекциях и их интерфейсах.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Аноним, Вы писали:
А>>конкретные вещи: А>>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс. А>>Я не могу вставить вилку 220 в 360. А>>Считай, что метод Add это вставки вилки в розетку
_FR>А кто вам _обещал_ какую-то конкретную розетку или вилку? Чем одна розетка\вилка лучше другой? Ничем, они равноправны. А переходники у любого _квалифицированного_ путешественника должны быть в наличии. Из приведённого вами примера виднен лишь недостаток квалификации
_FR>Продолжайте, весилите публику в том же духе.
по сути ответа на конкретный пример не услышал — следовательно, сказать нечего
Это ReadOnly класса Array. В примере автора используется явная реализация интерфейса ICollection<T>, которая возвращает true.
S>А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?
Через индексатор можно (для него ReadOnly — false), через ICollection — нет (для него ReadOnly — true).
QL>Это ReadOnly класса Array. В примере автора используется явная реализация интерфейса ICollection<T>, которая возвращает true.
Пусть так
S>>А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?
QL>Через индексатор можно (для него ReadOnly — false), через ICollection — нет (для него ReadOnly — true).
Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
Здравствуйте, samius, Вы писали:
A>>Потому что иначе получишь комбинаторный рост количества реализаций от количества интерфейсов. enumerable/readonly/resizable — это три разных признака. И тебе надо сделать какую-то системную реализаую для колелкции размер которой менять нельзя, но можно менять элементы. S>Из них массив является лишь enumerable. В чем проблема? Где взрыв? Где множественное наследование?
Массив в таком случае должен реализовывать два интерфейса — для перечисления и для изменения значения элемента и не должен реализовывать интерфейс для смены размера. Как несложно посчитать всего существует 3 + 3*2 + 1 = 10 разных комбинаций. То есть если уж ввёл интерфейсы, то будь добр реализовать 10 разных стандартных коллекций на все случаи жизни.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, samius, Вы писали:
A>>>Потому что иначе получишь комбинаторный рост количества реализаций от количества интерфейсов. enumerable/readonly/resizable — это три разных признака. И тебе надо сделать какую-то системную реализаую для колелкции размер которой менять нельзя, но можно менять элементы. S>>Из них массив является лишь enumerable. В чем проблема? Где взрыв? Где множественное наследование?
A>Массив в таком случае должен реализовывать два интерфейса — для перечисления и для изменения значения элемента и не должен реализовывать интерфейс для смены размера. Как несложно посчитать всего существует 3 + 3*2 + 1 = 10 разных комбинаций. То есть если уж ввёл интерфейсы, то будь добр реализовать 10 разных стандартных коллекций на все случаи жизни.
Я бы удовлетворился стандартными контейнерами. Мне не нравится что интерфейсы не fine-grained.
Здравствуйте, samius, Вы писали:
S>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
S>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
Явная реализация интерфейса. Здесь А — аналог ICollection<T>, B — аналог Array
interface A
{
bool IsReadonly { get; }
}
class B : A
{
public bool IsReadonly
{
get { return false; }
}
bool A.IsReadonly
{
get { return true; }
}
}
Здравствуйте, samius, Вы писали:
A>>Массив в таком случае должен реализовывать два интерфейса — для перечисления и для изменения значения элемента и не должен реализовывать интерфейс для смены размера. Как несложно посчитать всего существует 3 + 3*2 + 1 = 10 разных комбинаций. То есть если уж ввёл интерфейсы, то будь добр реализовать 10 разных стандартных коллекций на все случаи жизни. S>Я бы удовлетворился стандартными контейнерами. Мне не нравится что интерфейсы не fine-grained.
Смысла в это всё равно нет, потому что я лично сам встречался со случаями когда коллекция ReadOnly/FixedSize иногда. Интерфейсами такое не обозначить.
Здравствуйте, samius, Вы писали:
S>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, samius, Вы писали:
S>>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
A>Вообще-то, есть свойство IsFixedSize
У другого интерфейса. Я просил без даункаста
Re[4]: int[].Add
От:
Аноним
Дата:
25.11.10 08:35
Оценка:
Здравствуйте, LF, Вы писали:
А>>конкретные вещи: А>>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс. А>>Я не могу вставить вилку 220 в 360. А>>Считай, что метод Add это вставки вилки в розетку LF>Приведение массива к интерфейсу это использование переходника для вилки. С переходником вставить сможешь.
Здравствуйте, QrystaL, Вы писали:
S>>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
QL>Явная реализация интерфейса. Здесь А — аналог ICollection<T>, B — аналог Array
Есть IList<T>. Как узнать, можно ли изменить элемент через индексатор без исключений и даункастов?