Re[3]: Параметризованные формы
От: _FRED_ Черногория
Дата: 17.11.10 12:00
Оценка: 2 (1)
Здравствуйте, kirill_kgz, Вы писали:

_FR>>А вы можете показать, для чего в классе формы нужно знать именно тип Customer и почему не достаточно одного интерфейса

_FR>>Из примера этого не понять.

_>Чтобы мы могли при сохранении данных и их отображении на форме обращаться на прямую к свойствам, которые есть только у класса.


В том-то и дело: fParent-у знать про Customer ни разу не обязательно: детали нужны только уже в fCustomer. Поэтому я бы сделал как-то так (вообще, код кажется очень не правильным, но это лучше обсуждать в Архитектуре: сейчас же только о замене дженериков):
    public partial class fParent : Form
    {
        protected virtual IEntity ItemCore { get; }

        protected virtual void SaveData()
        {
            ItemCore.Save();
        }

        protected DialogResult EditItemCore(bool showModal)
        {
            this.FillElements();
            this.ApplySecuritySettings();

            if (showModal)
                return this.ShowDialog();
            else
            {
                this.MdiParent = UIManager.MDIForm;
                this.Show();
                return DialogResult.OK;
            }
        }
    }


    public partial class fCustomer : fParent <Customer>
    {
        private Customer Item { get; set; }

        protected override IEntity ItemCore { get { return Item; } }

        public DialogResult EditItem(Customer item, bool showModal)
        {
            Item = item;
            return EditItemCore(showModal);
        }
    }


В чём цимес: fParent ничего не знает про конкретные IEntity, и только конкретная формула знает, с чем работает. Но при этом не нужно тянуть за собой дженерик-параметры в иерархии (а где-то ещё какой параметр понадобится? а кому-то надо будет обобщённо работать с fParent и ему придётся знать/получать тип entity).

В данном случае вы используете дженерики исключительно для генерации кода (по сути — двух свойств в fCustomer в моём примере (хранящего данные Item и предоставляющего их для базы ItemCore)). Для кодогенерации, если она действительна нужна, лучше использовать специально заточенные средства: можно или создать шаблон страницы или, если первого способа не достаточно, прикрутить T4.

_>Напишите пожалуйста пример, когда будет достаточно только интерфейса для отображения данных, и как их в этом случае отображать на форме


Для обобращения конкретные типы, вообще говоря, не нужны: используйте биндинг. В вашем же примере конкретики в базе и так нету, она в наследниках.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.