Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / закрыть доступ к методу при наследовании / 25 сообщений из 45, страница 1 из 2
30.09.2016, 00:06
    #39318228
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    public class Rows : List<Row>
    {
        HH header; //как видно, у всех строк один заголовок
        public Rows(HH header) //и он инициализируется здесь
            : base()
        {
            this.headerCell = headerCell;
        }
        public void Add()
        {
            this.Add(new MDRow(headerCell));
        }
        new private void Add(MDRow item) //жалкая попытка запретить доступ к этому методу извне
        {
            ((List<MDRow>)this).Add(item);
        }
    }



Как закрыть доступ к методу при наследовании?
В и-нете находил только ответы из разряда "значит, неправильно проектируешь, так нельзя". Не подходит :)
...
Рейтинг: 0 / 0
30.09.2016, 00:08
    #39318229
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Могу там вписать просто тупо NotImplementedException
Не подходит по той причине, что в случае случайного использования метода (на автомате или ещё как), ошибка должна возникнуть на этапе компиляции, а не на этапе тестирования.
...
Рейтинг: 0 / 0
30.09.2016, 01:18
    #39318242
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles WeylandНе подходит :)
пичалька
...
Рейтинг: 0 / 0
30.09.2016, 01:44
    #39318249
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles WeylandМогу там вписать просто тупо NotImplementedException
Не подходит по той причине, что в случае случайного использования метода (на автомате или ещё как), ошибка должна возникнуть на этапе компиляции, а не на этапе тестирования.
Через PostSharp
...
Рейтинг: 0 / 0
30.09.2016, 03:52
    #39318263
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Не наследовать лист, а сделать его полем класса и наружу высунуть то, что тебе нужно
...
Рейтинг: 0 / 0
30.09.2016, 04:30
    #39318269
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles Weyland
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    public class Rows : List<Row>
    {
        HH header; //как видно, у всех строк один заголовок
        public Rows(HH header) //и он инициализируется здесь
            : base()
        {
            this.headerCell = headerCell;
        }
        public void Add()
        {
            this.Add(new MDRow(headerCell));
        }
        new private void Add(MDRow item) //жалкая попытка запретить доступ к этому методу извне
        {
            ((List<MDRow>)this).Add(item);
        }
    }



Как закрыть доступ к методу при наследовании?
В и-нете находил только ответы из разряда "значит, неправильно проектируешь, так нельзя". Не подходит :)Лучше попробуй применить такую структуру данных:
Код: c#
1.
2.
3.
4.
5.
6.
class Model
{
    public HH Header { get; set; }

    public List<Row> Rows { get; set; }
}
...
Рейтинг: 0 / 0
30.09.2016, 10:21
    #39318366
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles WeylandВ и-нете находил только ответы из разряда "значит, неправильно проектируешь, так нельзя". Не подходит :)

Это самый правильный ответ. В этом случае нельзя использовать наследование, а надо использовать композицию.
...
Рейтинг: 0 / 0
30.09.2016, 10:28
    #39318376
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles Weyland,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  public class Rows : List<Row>
        {
            HH header; //как видно, у всех строк один заголовок
            public Rows(HH header) //и он инициализируется здесь
                : base()
            {
                
            }
            /// <summary>
            /// попытка использования вызовет ошибку компиляции
            /// </summary>
            /// <param name="item"></param>
          [Obsolete("Гуляй Вася, ешь опилки", true)]
            new public void Add(Row item) //жалкая попытка запретить доступ к этому методу извне
            {
              
            }
        }
...
Рейтинг: 0 / 0
30.09.2016, 10:46
    #39318402
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
PallarisНе наследовать лист, а сделать его полем класса и наружу высунуть то, что тебе нужно
Нужно дофига чего.. в том числе, и отправлять в качестве аргумента в функции f(List<..>)
...
Рейтинг: 0 / 0
30.09.2016, 10:46
    #39318403
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles Weyland,

Код: c#
1.
public class Rows : IReadOnlyList<Row>




мм?
...
Рейтинг: 0 / 0
30.09.2016, 11:08
    #39318424
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
hVostt
мм?
А если удаление треба?
...
Рейтинг: 0 / 0
30.09.2016, 11:19
    #39318436
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
ЕвгенийВ,

Ну и добавляешь метод удаления )
...
Рейтинг: 0 / 0
30.09.2016, 11:21
    #39318438
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles WeylandPallarisНе наследовать лист, а сделать его полем класса и наружу высунуть то, что тебе нужно
Нужно дофига чего.. в том числе, и отправлять в качестве аргумента в функции f(List<..>)

Функции, кстати, не должны никогда принимать List, только так (в порядке предпочтения):

IEnumerable<T>
IReadOnlyCollection<T>
IReadOnlyList<T>
ICollection<T>
IList<T>

И проблем не будет.
...
Рейтинг: 0 / 0
30.09.2016, 11:23
    #39318440
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
hVosttCharles Weylandпропущено...

Нужно дофига чего.. в том числе, и отправлять в качестве аргумента в функции f(List<..>)

Функции, кстати, не должны никогда принимать List, только так (в порядке предпочтения):

IEnumerable<T>
IReadOnlyCollection<T>
IReadOnlyList<T>
ICollection<T>
IList<T>

И проблем не будет. Вот беспроблемный способ. Всё остальное влечёт за собой проблемы различной степени тяжести.
...
Рейтинг: 0 / 0
30.09.2016, 11:23
    #39318442
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Блин, получается в любом случае мне нужно писать "своими словами" то, что уже написано.

Если мне нужен List<Row> со своим конструктором (вместо конструктора без параметров) и со своим Add без параметров (вместо Add с параметрами) - мне придётся писать чуть ли не с нуля свой класс, в котором реализовывать всё, что реализовано в List, кроме этих двух вещей.

}{ерня какая-то((
...
Рейтинг: 0 / 0
30.09.2016, 11:25
    #39318446
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
hVosttФункции, кстати, не должны никогда принимать List, только так (в порядке предпочтения):

IEnumerable<T>
IReadOnlyCollection<T>
IReadOnlyList<T>
ICollection<T>
IList<T>

И проблем не будет.
с этим согласен. Это я навскидку сказал. Потом сообразил, что этого нафиг не надо.
...
Рейтинг: 0 / 0
30.09.2016, 11:26
    #39318450
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles WeylandБлин, получается в любом случае мне нужно писать "своими словами" то, что уже написано.Да, если будешь игнорировать мои сообщения . Впрочем, можно применить что-то вроде ObservableCollection и подписаться на изменения, но это тоже ничего хорошего.
...
Рейтинг: 0 / 0
30.09.2016, 11:26
    #39318452
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles Weyland}{ерня какая-то((

Никакой херни.

Вот тебе заготовка:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
public class MyCustomList<T> : IList<T>
    {
        public IEnumerator<T> GetEnumerator()
        {
            throw new NotImplementedException();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public void Add(T item)
        {
            throw new NotImplementedException();
        }

        public void Clear()
        {
            throw new NotImplementedException();
        }

        public bool Contains(T item)
        {
            throw new NotImplementedException();
        }

        public void CopyTo(T[] array, int arrayIndex)
        {
            throw new NotImplementedException();
        }

        public bool Remove(T item)
        {
            throw new NotImplementedException();
        }

        public int Count { get; }
        public bool IsReadOnly { get; }
        public int IndexOf(T item)
        {
            throw new NotImplementedException();
        }

        public void Insert(int index, T item)
        {
            throw new NotImplementedException();
        }

        public void RemoveAt(int index)
        {
            throw new NotImplementedException();
        }

        public T this[int index]
        {
            get { throw new NotImplementedException(); }
            set { throw new NotImplementedException(); }
        }
    }



Внутри можешь спрятать List<T>.
...
Рейтинг: 0 / 0
30.09.2016, 11:29
    #39318457
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Алексей КЛучше попробуй применить такую структуру данных:
Код: c#
1.
2.
3.
4.
5.
6.
class Model
{
    public HH Header { get; set; }

    public List<Row> Rows { get; set; }
}


не совсем понятно.
Я ведь хочу создать свой класс Rows. Я в нём ещё пару своих событий описываю, добавляю функциональность, которая необходима для работы с группой строк как с одним объектом. Например, "добавить колонку", "удалить колонку" в случае изменения количества столбцов в заголовке header и т.д. Поэтому считаю неправильным работать с "голым" классом List<Row>. Куда ж всю логику работы с группой строк девать?
...
Рейтинг: 0 / 0
30.09.2016, 11:30
    #39318461
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Алексей КДа, если будешь игнорировать мои сообщения .
не, я не игнорирую - благодарен за любые высказанные мысли.
Как раз последовательно читал всё, что мне написали и отвечал.
...
Рейтинг: 0 / 0
30.09.2016, 11:30
    #39318462
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles WeylandАлексей КЛучше попробуй применить такую структуру данных:
Код: c#
1.
2.
3.
4.
5.
6.
class Model
{
    public HH Header { get; set; }

    public List<Row> Rows { get; set; }
}


не совсем понятно.
Я ведь хочу создать свой класс Rows. Я в нём ещё пару своих событий описываю, добавляю функциональность, которая необходима для работы с группой строк как с одним объектом. Например, "добавить колонку", "удалить колонку" в случае изменения количества столбцов в заголовке header и т.д. Поэтому считаю неправильным работать с "голым" классом List<Row>. Куда ж всю логику работы с группой строк девать?Ну и добавляй в класс Model методы "добавить колонку" и т. п.
...
Рейтинг: 0 / 0
30.09.2016, 11:31
    #39318463
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles WeylandАлексей КЛучше попробуй применить такую структуру данных:
Код: c#
1.
2.
3.
4.
5.
6.
class Model
{
    public HH Header { get; set; }

    public List<Row> Rows { get; set; }
}



не совсем понятно.
Я ведь хочу создать свой класс Rows. Я в нём ещё пару своих событий описываю, добавляю функциональность, которая необходима для работы с группой строк как с одним объектом. Например, "добавить колонку", "удалить колонку" в случае изменения количества столбцов в заголовке header и т.д. Поэтому считаю неправильным работать с "голым" классом List<Row>. Куда ж всю логику работы с группой строк девать?

Алексей говорит дело, послушай его. Композиция лучше наследования. Чем монстрячить свой класс-коллекцию, создай отедельный класс, с конкретными методами и свойствами, где будет в том числе коллекция.

Всегда, предпочитай композицию наследованию! И 20 раз подумай, прежде чем делать свою коллекцию в режиме наследования — это практически всегда тупиковый путь.
...
Рейтинг: 0 / 0
30.09.2016, 11:33
    #39318466
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
hVosttВнутри можешь спрятать List<T>.
это я и имел в виду. Просто на пустом месте разрастается код.
Получится
Код: c#
1.
RemoveAt(..){list.RemoveAt(..);}


и так весь код.
Ну, видимо, по этому пути пойти придётся.
...
Рейтинг: 0 / 0
30.09.2016, 11:35
    #39318470
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
В общем, послушав вас, сделаю так
Код: c#
1.
2.
3.
4.
5.
6.
class Model: IList<T>
{
    public HH Header { get; set; }

    public List<Row> Rows { get; set; }
}



Если профи выбирают этот путь, значит, это и есть правильный путь.
Спасибо за информацию))
...
Рейтинг: 0 / 0
30.09.2016, 11:39
    #39318473
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
закрыть доступ к методу при наследовании
Charles WeylandВ общем, послушав вас, сделаю так
Код: c#
1.
2.
3.
4.
5.
6.
class Model: IList<T>
{
    public HH Header { get; set; }

    public List<Row> Rows { get; set; }
}



Если профи выбирают этот путь, значит, это и есть правильный путь.
Спасибо за информацию))Зачем Model реализовывать IList? Есть объективные причины, кроме желания потренироваться?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / закрыть доступ к методу при наследовании / 25 сообщений из 45, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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