Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Переписать только геттер при наследовании / 25 сообщений из 148, страница 1 из 6
23.04.2014, 07:07
    #38622400
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
Есть класс. Хочу получить такой же класс, только с другой функциональностью геттеров. Но чтобы всё остальное, включая логику сеттеров, уведомления об изменении свойств (INotifyPropertyChanged) и прочие навороты работали как в старом классе. Искал, думал - придумал пока только такой вариант. Проверил - вроде, работает так, как мне надо. Но это на простом примере, без наворотов. Покритикуйте - плохой дизайн там или ещё чего. Может, есть способ лучше решить такую задачу?

Т. е. идея в том, что в моём подходе при наследовании надо переписать только геттер, а всё остальное (сеттеры со сложной логикой, INotifyPropertyChanged и пр.) придёт само только за счёт наследования.


Код: 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.
namespace ConsoleApplication1
{
    public class A
    {
        private int _n = 1;
        public int N
        {
            get { return _n; }
            set { _n = value; }
        }

        // Дофига сложной супер-логики...
    }

    // Не менее крут, чем класс А, но только со своим геттером.
    public class B : A
    {
        new public int N
        {
            get { return 10; }
            set { base.N = value; }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();

            Console.WriteLine(b.N);
            Console.WriteLine(((A)b).N);

            b.N = 2;

            Console.WriteLine(b.N);
            Console.WriteLine(((A)b).N);

            Console.Read();
        }
    }
}

...
Рейтинг: 0 / 0
23.04.2014, 07:08
    #38622402
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
Да, результат работы проги

10
1
10
2
...
Рейтинг: 0 / 0
23.04.2014, 09:36
    #38622503
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320, почему свойству задаётся значение 2, а оно возвращает 10? В чём смысл такого поведения?
...
Рейтинг: 0 / 0
23.04.2014, 10:03
    #38622534
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
skyANAuser7320, почему свойству задаётся значение 2, а оно возвращает 10? В чём смысл такого поведения?
Да, я бы тоже был сильно удивлен таким.
Что же до вопроса топика - чего ж здесь сложного? логику геттера помещаем в виртуальный метод, в самом геттере возращаем результат выполнения этого метода, и в классе-наследнике этот виртуальный метод переопределяем.
...
Рейтинг: 0 / 0
23.04.2014, 10:51
    #38622597
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
Сон Веры Павловны, для начала бы хотелось понять, зачем вообще класс-наследник нужен. А то понадобиться ТС возвращать 20, он будет походу класс C лепить
...
Рейтинг: 0 / 0
23.04.2014, 11:06
    #38622622
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
skyANAuser7320, почему свойству задаётся значение 2, а оно возвращает 10? В чём смысл такого поведения?
Я хотел сделать модель представления, которая должна для одних представлений возвращать одни значения, а для других - другие. Скажем, в одном месте показывать картинку-заглушку, обозначающую, что картинка не задана, а в другом - пустое место (картинка же не задана).

Сначала я всё сделал на одной модели представления, только с конвертерами - где надо, конвертер возвращал картинку-заглушку, вместо того, чтобы оставить в привязке пустое место.

Но потом я вычитал, что помещать такую логику в конвертеры - дурной тон. И что такая логика должна быть в моделях представления. И действительно, подумал я, чего это конвертер выполняет какую-то логику модели представления, когда он относится к представлению. Ну и поместил эту логику в модель представления. Т. е. базовая модель представления у меня показывает картинку или пустое место - в зависимости от того, есть ли картинка, а специальная модель представления, нужная в специальном месте, показывает заглушку, обозначающую, что картинка не задана.

Сон Веры ПавловныskyANAuser7320, почему свойству задаётся значение 2, а оно возвращает 10? В чём смысл такого поведения?
Да, я бы тоже был сильно удивлен таким.
Что же до вопроса топика - чего ж здесь сложного? логику геттера помещаем в виртуальный метод, в самом геттере возращаем результат выполнения этого метода, и в классе-наследнике этот виртуальный метод переопределяем.
Это тоже вариант. А это лучше или хуже моего варианта?
...
Рейтинг: 0 / 0
23.04.2014, 11:09
    #38622628
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
skyANAСон Веры Павловны, для начала бы хотелось понять, зачем вообще класс-наследник нужен. А то понадобиться ТС возвращать 20, он будет походу класс C лепить
Такой пример в возвратом 10 - для простоты. На самом деле мне просто нужна другая логика в геттере (или сеттере - не важно), но вся остальная функциональность должна остаться та же.

Понимаете? Просто хочу другой геттер, но всё остальное такое же.

Просто в Сишарпе такое ограничение, что нельзя отдельно геттеры или сеттеры переписывать в наследуемых классах - только целиком свойства. Поэтому люди и выкручиваются через методы, вызываемые геттерами-сеттерами или через вот такое, как у меня.
...
Рейтинг: 0 / 0
23.04.2014, 12:04
    #38622759
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320Я хотел сделать модель представления, которая должна для одних представлений возвращать одни значения, а для других - другие. Скажем, в одном месте показывать картинку-заглушку, обозначающую, что картинка не задана, а в другом - пустое место (картинка же не задана).Не проще описать эту логику в View с помощью триггеров?
...
Рейтинг: 0 / 0
23.04.2014, 12:39
    #38622846
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320Покритикуйте - плохой дизайн там или ещё чего. Может, есть способ лучше решить такую задачу?
понимаешь разницу между overload и override ?
...
Рейтинг: 0 / 0
23.04.2014, 12:56
    #38622887
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
Алексей Кuser7320Я хотел сделать модель представления, которая должна для одних представлений возвращать одни значения, а для других - другие. Скажем, в одном месте показывать картинку-заглушку, обозначающую, что картинка не задана, а в другом - пустое место (картинка же не задана).Не проще описать эту логику в View с помощью триггеров?
Например?

Я вначале пользовался конвертерами (и всё работало, как мне надо) - тоже "логика во вью". Решил отказаться от "логики во вью" по идеологическим соображениям.

pationuser7320Покритикуйте - плохой дизайн там или ещё чего. Может, есть способ лучше решить такую задачу?
понимаешь разницу между overload и override ?
Первое - метод с тем же названием, но другой остальной частью сигнатуры. Например.

А второе - при полностью совпадающей сигнатуре в унаследованных классах. Например.

А что?
...
Рейтинг: 0 / 0
23.04.2014, 13:32
    #38622964
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320Алексей Кпропущено...
Не проще описать эту логику в View с помощью триггеров?
Например?
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<ContentControl Content={Binding MyDataProperty}>
    <ContentControl.Style>
        <Style>
            <Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding MyDataProperty}" Value="{x:Null}">
                    <Setter Property="ContentTemplate" Value="{StaticResource EmptyTemplate}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>


user7320Я вначале пользовался конвертерами (и всё работало, как мне надо) - тоже "логика во вью". Решил отказаться от "логики во вью" по идеологическим соображениям .Ещё одна жертва информационной войны! :-)

Меньше читай "классику" ...
...
Рейтинг: 0 / 0
23.04.2014, 14:29
    #38623078
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
Алексей Кuser7320пропущено...

Например?
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<ContentControl Content={Binding MyDataProperty}>
    <ContentControl.Style>
        <Style>
            <Setter Property="ContentTemplate" Value="{StaticResource DefaultTemplate}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding MyDataProperty}" Value="{x:Null}">
                    <Setter Property="ContentTemplate" Value="{StaticResource EmptyTemplate}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>


Спасибо, гляну.


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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class Model
{
    public int Value;

    public bool IsWarning;
}

.................

public Model GetModel()
{
    var value = GetValue();

    return new Model
    {
        Value = value,
        IsWarning = value > 10 // логика предметной области
    };
}


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<TextBlock Text="{Binding Value}">
    <TextBlock.Style>
        <Style.Triggers>
            <!-- Логика представления -->
            <DataTrigger Binding="{Binding IsWarning}" Value="True">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </TextBlock.Style>
</TextBlock>
...
Рейтинг: 0 / 0
23.04.2014, 15:31
    #38623238
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
Алексей Кuser7320Здесь уже другая классика и авторитеты . Видите, какие там тысячники мнения имеют? Ну и я согласен с ними - конвертеры относятся к представлениям, а логику надо в моделях размещать. Другой вопрос, а к представлениям ли относятся конвертеры?В модели должна быть логика предметной области. В представлении - логика представления.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class Model
{
    public int Value;

    public bool IsWarning;
}

.................

public Model GetModel()
{
    var value = GetValue();

    return new Model
    {
        Value = value,
        IsWarning = value > 10 // логика предметной области
    };
}


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<TextBlock Text="{Binding Value}">
    <TextBlock.Style>
        <Style.Triggers>
            <!-- Логика представления -->
            <DataTrigger Binding="{Binding IsWarning}" Value="True">
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </TextBlock.Style>
</TextBlock>


Я имел ввиду модель представления, конечно же.
...
Рейтинг: 0 / 0
23.04.2014, 15:42
    #38623265
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
И это... насколько я знаю, писать логику в представлении - а конкретно, в XAML - это возникло из идеи "не давать дизайнерам смотреть код". По-моему, самое место для логики представления - не замл, не конвертеры, а так называемый код поддержки, т. е. класс представления.

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

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

Всё это плохо, потому что ради удобства вносится бардак, хаос. Теперь код представления и, частично, модели представления разнесён по четырём местам:

моделям представления;
конвертерам;
разметке;
классам представления.

И каждый хреначит в соответствии со своей "религией" - как он видит, где должен быть код. У некоторых прямо во всех этих местах и разбросано всё - задолбаешься искать, где у него там что куда конвертится.

А вот если бы дизигнерам не подлизывали и всё строго в одном месте требовали бы размещать (ну, в двух - в модели представления и в классе представления-коде поддержки), то было бы больше порядка.


Аналогия подобного говна в ХТМЛ - когда в добавок к джаваскрипту добавили возможность писать некоторую логику в стилях. А джаваскрипт вознесли вплоть до серверов. ИДИОТЫ!
...
Рейтинг: 0 / 0
23.04.2014, 15:49
    #38623280
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320Я имел ввиду модель представления, конечно же.Модель представления, мне кажется, не должна содержать логики. Она нужна как "переходник", для сращивания модели и представления, если представление с моделью в таком виде работать не может. В ней только делегирование и преобразование.
...
Рейтинг: 0 / 0
23.04.2014, 15:51
    #38623283
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320pationпропущено...

понимаешь разницу между overload и override ?
Первое - метод с тем же названием, но другой остальной частью сигнатуры. Например.

А второе - при полностью совпадающей сигнатуре в унаследованных классах. Например.

А что?

не совсем правильно,
ты getter хочешь оверрайдить или оверлоадить?
...
Рейтинг: 0 / 0
23.04.2014, 15:52
    #38623286
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320Аналогия подобного говна в ХТМЛ
оффтоп, этот срач в соседнем форуме
...
Рейтинг: 0 / 0
23.04.2014, 15:54
    #38623290
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320По-моему, самое место для логики представления - не замл, не конвертеры, а так называемый код поддержки, т. е. класс представления.Всему своё место.
...
Рейтинг: 0 / 0
23.04.2014, 16:03
    #38623313
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
Алексей Кuser7320Я имел ввиду модель представления, конечно же.Модель представления, мне кажется, не должна содержать логики. Она нужна как "переходник", для сращивания модели и представления, если представление с моделью в таком виде работать не может. В ней только делегирование и преобразование.
Ну, это зависит от того, что понимать под "логикой". И это зависит от проекта. В больших проектах столько разных слоёв и так всё наворочено, что и на модель представления может немало логики перепасть.

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

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

И только под логикой модели я собственно подразумеваю логику предметной области (бизнес-логику или как хотите это назовите - я это не различаю).

pationuser7320пропущено...

Первое - метод с тем же названием, но другой остальной частью сигнатуры. Например.

А второе - при полностью совпадающей сигнатуре в унаследованных классах. Например.

А что?

не совсем правильно,
ты getter хочешь оверрайдить или оверлоадить?
Оверрайдить через оверлоад.

Я хочу переписать код геттера. Но сделать это можно только через оверлоад всего свойства - т. е. и геттера в том числе. Таковы ограничения Сишарпа.

Изопропилuser7320Аналогия подобного говна в ХТМЛ
оффтоп, этот срач в соседнем форуме
Джаваскрипт всегда уместно и вовремя поругать.
...
Рейтинг: 0 / 0
23.04.2014, 16:08
    #38623323
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320Под логикой модели представления я понимаю вот это ваше "переходник". В некоторых случаях переходник может быть очень даже нагружен. Я уже приводил пример - в модели только идентификатор, а в модели представления текстура (картинка), геометрия (вершины, полигоны и пр.) и прочие визуальные атрибуты."Как хотите это назовите - я это не различаю" (ц)

Это такая же модель, как и все остальные. Просто она расположена локально, а не в, например, вебсервисе.
...
Рейтинг: 0 / 0
23.04.2014, 16:26
    #38623357
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320
Код: 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.
namespace ConsoleApplication1
{
    public class A
    {
        private int _n = 1;
        public int N
        {
            get { return _n; }
            set { _n = value; }
        }

        // Дофига сложной супер-логики...
    }

    // Не менее крут, чем класс А, но только со своим геттером.
    public class B : A
    {
        new public int N
        {
            get { return 10; }
            set { base.N = value; }
        }
    }


  
}


Как то так надо.
Код: 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.
  public class A
    {
        int _Prop;
        public virtual int Prop
        {
            get
            {
                return _Prop;
            }
            set
            {
                _Prop = value;
            }
        }
    }
    public class B : A
    {
        public override int Prop
        {
            get
            {
                return 10;
            }
            set
            {
                base.Prop = value;
            }
        }
    }
...
Рейтинг: 0 / 0
23.04.2014, 16:28
    #38623363
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
Я вообще не пойму, зачем разделили понятия Model и ViewModel. Мне кажется, достаточно одного понятия Model. ViewModel только добавляет путаницу.
...
Рейтинг: 0 / 0
23.04.2014, 16:47
    #38623398
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
ЕвгенийВuser7320
Код: 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.
namespace ConsoleApplication1
{
    public class A
    {
        private int _n = 1;
        public int N
        {
            get { return _n; }
            set { _n = value; }
        }

        // Дофига сложной супер-логики...
    }

    // Не менее крут, чем класс А, но только со своим геттером.
    public class B : A
    {
        new public int N
        {
            get { return 10; }
            set { base.N = value; }
        }
    }


  
}


Как то так надо.
Код: 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.
  public class A
    {
        int _Prop;
        public virtual int Prop
        {
            get
            {
                return _Prop;
            }
            set
            {
                _Prop = value;
            }
        }
    }
    public class B : A
    {
        public override int Prop
        {
            get
            {
                return 10;
            }
            set
            {
                base.Prop = value;
            }
        }
    }


Так по сути это то же самое?

Я, кстати, не понимаю, в чём разница между парой "virtual-override" и "new". New вроде как просто убирает предупреждение компилятора - типа, прогер сознательно скрыл метод или свойство базового класса, а не по ошибке.

Алексей КЯ вообще не пойму, зачем разделили понятия Model и ViewModel. Мне кажется, достаточно одного понятия Model. ViewModel только добавляет путаницу.
Я же приводил пример с идентификаторами и картинками.

Вот тем, у тех, у кого нет такой специфики - действительно, у них М и ВМ выглядят одинаково и ВМ так кажется лишним слоем. Для простых приложений и не надо выдумывать всякие МВВМ. А вот напишите Офис - там ещё и не такое придумаете. Некоторые вообще аспектно-ориентированное программирование любят.
...
Рейтинг: 0 / 0
23.04.2014, 18:29
    #38623580
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать только геттер при наследовании
user7320Я, кстати, не понимаю, в чём разница между парой "virtual-override" и "new"
я же спрашивал тебя =))
учи матчасть
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Переписать только геттер при наследовании / 25 сообщений из 148, страница 1 из 6
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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