powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
25 сообщений из 61, страница 1 из 3
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182427
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу в классе хранить коллекцию. Раньше всегда выбирал конкретный тип - список, словарь и т. п. А сейчас вдруг задумался - может, лучше указывать что-нибудь универсальное, типа IEnumerable?

Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add.

В связи с этим возникла догадка, что я неправильно использую интерфейс. Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных. А интерфейсные типы использовать, например, в параметрах функций для их, функций, большей универсальности. И вообще, интерфейс IEnumerable нужен не для редактирования элементов, а для их чтения через какой-нибудь foreach. Т. е., если где-то в функции идёт последовательная обработка элементов коллекции, то IEnumerable как раз подойдёт в качестве типа параметра. Правильно я рассуждаю?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182459
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местами близко к правде, но в целом ахинея. Прочитай какую-нибудь теорию по ООП, где рассказывается про назначение классов и интерфейсов.
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182491
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных
IEnumerable<T> не рассматривал?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182492
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy...в целом ахинея. Прочитай какую-нибудь теорию по ООП...+1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Food
{
    // ...
}

public class Hamster
{
    private List<Food> harvestedFoods = new List<Food>();

    public IEnumerable<Food> HarvestedFoods
    {
        get { return harvestedFoods; }
    }

    public void Add(Food food)
    {
        // Тут хомяк может посолить, поперчить, проверить,
        // а не тухлая-ли еда попалась, перед тем как отложить впрок...
        harvestedFoods.Add(food); 
    }
}
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182521
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен Add используйте соответствующий интерфейс.
http://msdn.microsoft.com/ru-ru/library/63ywd54z.aspx
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182562
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

Надо различать реализацию и интерфейс класса. Внутри класса надо работать с тем, что удобнее: словарь, список и т.д. А вот принимать на вход и отдавать на выход можно и интерфейсами.
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182644
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtoruser7320,

Надо различать реализацию и интерфейс класса. Внутри класса надо работать с тем, что удобнее: словарь, список и т.д. А вот принимать на вход и отдавать на выход можно и интерфейсами.
Ну да, это я и имел ввиду. А "принимать" и "отдавать" можно же только функциями (в которые входят и конструкторы)? Вот я и говорю, что использовать интерфейсы лучше в параметрах функций, а хранить данные - не в интерфейсах, а в конкретных типах.

Изопропилuser7320Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных
IEnumerable<T> не рассматривал?
Так я изначально его и подразумевал. Про конкретику я имел ввиду List<T>, Array<T> и т. п. вместо IEnumerable<T>.

skyANAAntonariy...в целом ахинея. Прочитай какую-нибудь теорию по ООП...+1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Food
{
    // ...
}

public class Hamster
{
    private List<Food> harvestedFoods = new List<Food>();

    public IEnumerable<Food> HarvestedFoods
    {
        get { return harvestedFoods; }
    }

    public void Add(Food food)
    {
        // Тут хомяк может посолить, поперчить, проверить,
        // а не тухлая-ли еда попалась, перед тем как отложить впрок...
        harvestedFoods.Add(food); 
    }
}


А какой смысл этого кода? Ведь одно из назначений интерфейса - обобщение. Т. е. чтобы я не менял код, скажем, функции (а у вас что геттер, что Add - функции) при изменении типа коллекции, с которой работает эта функция. А у вас если я у поля HarvestedFoods заменю тип списка на какую-нибудь другую коллекцию, где нет Add, то мне придётся и код функции Add менять. Поэтому я и говорил, что если функция использует коллекцию так, что эта функциональность покрывается интерфейсом, то надо использовать интерфейс, а если не покрывается, то использование интерфейса бессмыслено. Т. е. если я в функции перебираю элементы через foreach, то можно использовать IEnumerable, т. к. все коллекции, реализующие IEnumerable, реализуют и foreach. А если я в функции добавляю элементы по одному через Add, то тут либо другой интерфейс (ICollection, как мне правильно подсказали), либо конкретный тип коллеции, который эту функциональность реализует.

Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет.
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182688
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Ведь одно из назначений интерфейса - обобщение. Тебе посоветовали что-то прочитать, а не выдумывать бредни.
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182717
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет.Термин инкапсуляция Вам о чём-нибудь говорит?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182746
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAuser7320Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет.Термин инкапсуляция Вам о чём-нибудь говорит?
Вы пытаетесь скрыть реализацию добавления элемента в поле-коллекцию класса? Тогда понятно. Только всё равно, не совсем удачная реализация - если заменять тип коллеции, то и реализацию тоже придётся менять. И имеет ли смысл такая мелочная инкапсуляция?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182784
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320skyANAпропущено...
Термин инкапсуляция Вам о чём-нибудь говорит?
Вы пытаетесь скрыть реализацию добавления элемента в поле-коллекцию класса?Нет.user7320Только всё равно, не совсем удачная реализация - если заменять тип коллеции, то и реализацию тоже придётся менять.Зато ничего не надо менять в 100500 местах внешнего кода, где используется класс Hamster.user7320И имеет ли смысл такая мелочная инкапсуляция?Прочитайте комментарии в методе Add.
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182882
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

"данные хранить лучше не в интерфейсных типах, а в конкретных" - хранится они все равно будут в конкретных.
Лучше чтоб наружу класса конкретные реализации не торчали. Если что, юзайте ICollection<T>, его достаточно в подавляющем большинстве случаев. Я предпочитаю по-дефолту отдавать иэнумерабл и менять интерфейс на более конкретный в случае необходимости, причем если перфоманс проблема в этом куске кода заведомо быть не может - использую линку. (Например метод вернул иэнумерабл, я знаю что внутри лист, а мне нужен каунт, если вопроса производительности в данном месте не стоит - оставлю инумерабл и воспользуюсь екстеншнметодом, предвосхещу - каст делать точно не надо).
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38182949
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtoruser7320,

Надо различать реализацию и интерфейс класса. Внутри класса надо работать с тем, что удобнее: словарь, список и т.д. А вот принимать на вход и отдавать на выход можно и интерфейсами.
+1
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38183146
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Хочу в классе хранить коллекцию. Раньше всегда выбирал конкретный тип - список, словарь и т. п. А сейчас вдруг задумался - может, лучше указывать что-нибудь универсальное, типа IEnumerable?

Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add.

В связи с этим возникла догадка, что я неправильно использую интерфейс. Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных. А интерфейсные типы использовать, например, в параметрах функций для их, функций, большей универсальности. И вообще, интерфейс IEnumerable нужен не для редактирования элементов, а для их чтения через какой-нибудь foreach. Т. е., если где-то в функции идёт последовательная обработка элементов коллекции, то IEnumerable как раз подойдёт в качестве типа параметра. Правильно я рассуждаю?Однозначного ответа нет. Всё зависит от задачи и настроения.
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38183445
Grigory_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user 7320 Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add.

Основное назначение интерфейсов описание сигнатур и поддержка отношения композиции. Поэтому фраза
в этом контексте не корректна, для вызова соответствующего метода экземпляра списка (на пример Add) достаточно
проверить поддерживает ли класс реализацию интерфейса ( на пример IEnumerable).
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38185377
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAAntonariy...в целом ахинея. Прочитай какую-нибудь теорию по ООП...+1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Food
{
    // ...
}

public class Hamster
{
    private List<Food> harvestedFoods = new List<Food>();

    public IEnumerable<Food> HarvestedFoods
    {
        get { return harvestedFoods; }
    }

    public void Add(Food food)
    {
        // Тут хомяк может посолить, поперчить, проверить,
        // а не тухлая-ли еда попалась, перед тем как отложить впрок...
        harvestedFoods.Add(food); 
    }
}


Тогда вот ещё такой вопрос по этому коду и вообще. В методах класса лучше использовать геттеры и сеттеры для полей-данных класса, или сами эти поля-данные? Ну, т. е. конкретно в этом примере понятно, что по смыслу надо использовать harvestedFoods вместо HarvestedFoods. А вообще? Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38185422
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё вопрос по коду Скайана. Будет лучше или хуже, если вместо

Код: c#
1.
private List<Food> harvestedFoods = new List<Food>();



сделать

Код: c#
1.
private IEnumerable<Food> harvestedFoods = new List<Food>();



?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38185470
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Локальные проперти - это маразм.
2. Зачем тебе в реализации понижаться до IEnumerable? Ещё не понял разницу между реализацией и интерфейсами?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38185486
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, что касается моего примера, то вполне очевидно, что Вы не можете использовать свойство HarvestedFoods вместо переменной harvestedFoods, также Вы не можете изменить тип переменной harvestedFoods на IEnumerable<Food>.
На IList<Food> и даже на ICollection<Food> можете, а вот на IEnumerable<Food>.
Почему? Предлагаю Вам самостоятельно ответить на этот вопрос. Пример-то проще некуда.
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38185499
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ1. Локальные проперти - это маразм.ТС не про локальные спрашивал, а:user7320Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов?

Отвечу. Есть. Геттер или сеттер может содержать какую-то логику.
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38186024
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grigory_RОсновное назначение интерфейсов описание сигнатур и поддержка отношения композиции.Композиция классов не получится?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38186030
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAМСУ1. Локальные проперти - это маразм.ТС не про локальные спрашивал, а:user7320Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов?

Отвечу. Есть. Геттер или сеттер может содержать какую-то логику.А если логика не нужна?
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38186064
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
ТС не про локальные спрашивал, а:пропущено...


Отвечу. Есть. Геттер или сеттер может содержать какую-то логику.А если логика не нужна?

на проперти можно поставить точку останова, на филде нет
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38186114
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если есть проперти то доступ к полю даже изнутри класса только через него
...
Рейтинг: 0 / 0
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
    #38188179
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis.если есть проперти то доступ к полю даже изнутри класса только через него
Это утверждение или рекомендация? Если первое, то это неправда. А если второе, то почему?
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]