Re[2]: int[].Add
От: Аноним  
Дата: 25.11.10 08:10
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Аноним, Вы писали:


[skipped]

много казуистики.

конкретные вещи:
есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс.
Я не могу вставить вилку 220 в 360.
Считай, что метод Add это вставки вилки в розетку
Re[4]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:12
Оценка:
Здравствуйте, QrystaL, Вы писали:

S>>Есть рецепт, как можно понять, можно ли вызывать метод IList<T>.Add без получения исключения и даункастинга?


QL>
QL>IList<int> arr = new int[10];
QL>if (!arr.IsReadOnly)
QL>{
QL>    arr.Add(5);
QL>}
QL>

хм, а в рефлекторе написано
public bool get_IsReadOnly()
{
    return false;
}

А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?
Re[4]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:13
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, samius, Вы писали:


А>>>>кто мне объяснит зачем мне доступен метод Add, который всегда будет кидать эксепшн?

Q>>>«Framework Design Guidelines», глава «9.7 Optional Feature Pattern».
S>>Есть рецепт, как можно понять, можно ли вызывать метод IList<T>.Add без получения исключения и даункастинга?

_FR>В этом суть паттерна и заключена, что на все подобные кейсы "есть рецепт". Подробнее ознакомиться можно здесь.


Хорошо, как понять можно ли использовать индексатор списка на запись?
Re[3]: int[].Add
От: LF  
Дата: 25.11.10 08:14
Оценка: :)
А>конкретные вещи:
А>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс.
А>Я не могу вставить вилку 220 в 360.
А>Считай, что метод Add это вставки вилки в розетку
Приведение массива к интерфейсу это использование переходника для вилки. С переходником вставить сможешь.
Re[3]: int[].Add
От: _FRED_ Черногория
Дата: 25.11.10 08:16
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>[skipped]

А>много казуистики.

То есть по сути вам ответить таки нечего

А>конкретные вещи:

А>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс.
А>Я не могу вставить вилку 220 в 360.
А>Считай, что метод Add это вставки вилки в розетку

А кто вам _обещал_ какую-то конкретную розетку или вилку? Чем одна розетка\вилка лучше другой? Ничем, они равноправны. А переходники у любого _квалифицированного_ путешественника должны быть в наличии. Из приведённого вами примера виднен лишь недостаток квалификации

Продолжайте, весилите публику в том же духе.
Help will always be given at Hogwarts to those who ask for it.
Re[9]: int[].Add
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.11.10 08:17
Оценка: +1 -1
Здравствуйте, samius, Вы писали:

A>>Без множественного наследования — нельзя.

S>И для чего оно тут?

Потому что иначе получишь комбинаторный рост количества реализаций от количества интерфейсов. enumerable/readonly/resizable — это три разных признака. И тебе надо сделать какую-то системную реализаую для колелкции размер которой менять нельзя, но можно менять элементы. Без множественного наследования будешь выписывать все варианты копипейстом. Можно привести фундаментальный и более просотой пример — System.Stream vs. istream/ostream.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[10]: int[].Add
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:23
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, samius, Вы писали:


A>>>Без множественного наследования — нельзя.

S>>И для чего оно тут?

A>Потому что иначе получишь комбинаторный рост количества реализаций от количества интерфейсов. enumerable/readonly/resizable — это три разных признака. И тебе надо сделать какую-то системную реализаую для колелкции размер которой менять нельзя, но можно менять элементы.

Из них массив является лишь enumerable. В чем проблема? Где взрыв? Где множественное наследование?

A>Без множественного наследования будешь выписывать все варианты копипейстом. Можно привести фундаментальный и более просотой пример — System.Stream vs. istream/ostream.


Напомню, мы говорим о коллекциях и их интерфейсах.
Re[4]: int[].Add
От: Аноним  
Дата: 25.11.10 08:24
Оценка: -1 :)
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Аноним, Вы писали:


А>>конкретные вещи:

А>>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс.
А>>Я не могу вставить вилку 220 в 360.
А>>Считай, что метод Add это вставки вилки в розетку

_FR>А кто вам _обещал_ какую-то конкретную розетку или вилку? Чем одна розетка\вилка лучше другой? Ничем, они равноправны. А переходники у любого _квалифицированного_ путешественника должны быть в наличии. Из приведённого вами примера виднен лишь недостаток квалификации


_FR>Продолжайте, весилите публику в том же духе.


по сути ответа на конкретный пример не услышал — следовательно, сказать нечего
Re[5]: FDG
От: QrystaL Украина  
Дата: 25.11.10 08:24
Оценка:
S>хм, а в рефлекторе написано
S>
S>public bool get_IsReadOnly()
S>{
S>    return false;
S>}
S>


Это ReadOnly класса Array. В примере автора используется явная реализация интерфейса ICollection<T>, которая возвращает true.

S>А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?


Через индексатор можно (для него ReadOnly — false), через ICollection — нет (для него ReadOnly — true).
Re[6]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:27
Оценка:
Здравствуйте, QrystaL, Вы писали:

S>>хм, а в рефлекторе написано

S>>
S>>public bool get_IsReadOnly()
S>>{
S>>    return false;
S>>}
S>>


QL>Это ReadOnly класса Array. В примере автора используется явная реализация интерфейса ICollection<T>, которая возвращает true.

Пусть так

S>>А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?


QL>Через индексатор можно (для него ReadOnly — false), через ICollection — нет (для него ReadOnly — true).


Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
Re[11]: int[].Add
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.11.10 08:28
Оценка:
Здравствуйте, samius, Вы писали:

A>>Потому что иначе получишь комбинаторный рост количества реализаций от количества интерфейсов. enumerable/readonly/resizable — это три разных признака. И тебе надо сделать какую-то системную реализаую для колелкции размер которой менять нельзя, но можно менять элементы.

S>Из них массив является лишь enumerable. В чем проблема? Где взрыв? Где множественное наследование?

Массив в таком случае должен реализовывать два интерфейса — для перечисления и для изменения значения элемента и не должен реализовывать интерфейс для смены размера. Как несложно посчитать всего существует 3 + 3*2 + 1 = 10 разных комбинаций. То есть если уж ввёл интерфейсы, то будь добр реализовать 10 разных стандартных коллекций на все случаи жизни.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[12]: int[].Add
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:32
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, samius, Вы писали:


A>>>Потому что иначе получишь комбинаторный рост количества реализаций от количества интерфейсов. enumerable/readonly/resizable — это три разных признака. И тебе надо сделать какую-то системную реализаую для колелкции размер которой менять нельзя, но можно менять элементы.

S>>Из них массив является лишь enumerable. В чем проблема? Где взрыв? Где множественное наследование?

A>Массив в таком случае должен реализовывать два интерфейса — для перечисления и для изменения значения элемента и не должен реализовывать интерфейс для смены размера. Как несложно посчитать всего существует 3 + 3*2 + 1 = 10 разных комбинаций. То есть если уж ввёл интерфейсы, то будь добр реализовать 10 разных стандартных коллекций на все случаи жизни.


Я бы удовлетворился стандартными контейнерами. Мне не нравится что интерфейсы не fine-grained.
Re[7]: FDG
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.11.10 08:32
Оценка:
Здравствуйте, samius, Вы писали:

S>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?


Вообще-то, есть свойство IsFixedSize
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: FDG
От: QrystaL Украина  
Дата: 25.11.10 08:32
Оценка:
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; }
    }
}
Re[13]: int[].Add
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.11.10 08:33
Оценка: -2
Здравствуйте, samius, Вы писали:

A>>Массив в таком случае должен реализовывать два интерфейса — для перечисления и для изменения значения элемента и не должен реализовывать интерфейс для смены размера. Как несложно посчитать всего существует 3 + 3*2 + 1 = 10 разных комбинаций. То есть если уж ввёл интерфейсы, то будь добр реализовать 10 разных стандартных коллекций на все случаи жизни.

S>Я бы удовлетворился стандартными контейнерами. Мне не нравится что интерфейсы не fine-grained.

Смысла в это всё равно нет, потому что я лично сам встречался со случаями когда коллекция ReadOnly/FixedSize иногда. Интерфейсами такое не обозначить.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: FDG
От: Qbit86 Кипр
Дата: 25.11.10 08:33
Оценка:
Здравствуйте, samius, Вы писали:

S>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?


Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.
Глаза у меня добрые, но рубашка — смирительная!
Re[8]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:33
Оценка: :)
Здравствуйте, 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>Приведение массива к интерфейсу это использование переходника для вилки. С переходником вставить сможешь.

ну да, получается нужен Адаптер
Re[8]: FDG
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.11.10 08:35
Оценка:
Здравствуйте, QrystaL, Вы писали:

S>>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?


QL>Явная реализация интерфейса. Здесь А — аналог ICollection<T>, B — аналог Array


Есть IList<T>. Как узнать, можно ли изменить элемент через индексатор без исключений и даункастов?
Re[9]: FDG
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.11.10 08:35
Оценка:
Здравствуйте, samius, Вы писали:

A>>Вообще-то, есть свойство IsFixedSize

S>У другого интерфейса. Я просил без даункаста

Акстись, у какого другого?


[ComVisible(true)]
public interface IList : ICollection, IEnumerable
{
    // Methods
    int Add(object value);
    void Clear();
    bool Contains(object value);
    int IndexOf(object value);
    void Insert(int index, object value);
    void Remove(object value);
    void RemoveAt(int index);

    // Properties
    bool IsFixedSize { get; }
    bool IsReadOnly { get; }
    object this[int index] { get; set; }
}
A journey of a thousand miles must begin with a single step © Lau Tsu
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.