Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Шаблоны как параметры шаблона / 23 сообщений из 23, страница 1 из 1
06.06.2014, 12:19
    #38663439
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Есть
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
abstract public class GridIBindingListRecordPrototype : IEditableObject
{//.... Реализация 
}

public abstract class ListRecordItem<T> : GridIBindingListRecordPrototype where T : EntityObject, new()
{//.... Реализация 

}


и менеджер
Код: c#
1.
2.
public class ListModelItemsManager<T> where T : GridIBindingListRecordPrototype, IDataSourceHelper, new()
{}


А хочется
Код: c#
1.
2.
3.
public class ListModelItemsManager<T> where T : ListRecordItem<T>, IDataSourceHelper, new()
{
}

, но так нельзя. Как вывернуться?
...
Рейтинг: 0 / 0
06.06.2014, 12:19
    #38663443
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
через интерфейсы не предлагать, я и сам так могу.
...
Рейтинг: 0 / 0
06.06.2014, 15:32
    #38663753
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Proga,

что именно нельзя?
...
Рейтинг: 0 / 0
06.06.2014, 15:38
    #38663771
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Можно так:

1) public class ListModelItemsManager<T, U> where T : ListRecordItem<U>, IDataSourceHelper, new()
2) ListRecordItem<T> должен наследовать ListRecordItem<ListRecordItem<T>>
...
Рейтинг: 0 / 0
06.06.2014, 15:40
    #38663774
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Изивиняюсь, второй вариант не подходит )
...
Рейтинг: 0 / 0
06.06.2014, 15:41
    #38663776
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
2й исправленный:
public class MyListRecordItem<T> : ListRecordItem<MyListRecordItem<T>> - вот такой тип можно будет подставить в генерик
...
Рейтинг: 0 / 0
06.06.2014, 16:44
    #38663892
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Lelouch, предложенные варианты приводят к ошибке.
...
Рейтинг: 0 / 0
06.06.2014, 16:46
    #38663896
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Proga,

Мой хрустальный шар пока еще не доставили, поэтому напишите, к каким ошибкам то?
...
Рейтинг: 0 / 0
06.06.2014, 16:49
    #38663900
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
вот так можно:

public class ListModelItemsManager<T, U>
where T : ListRecordItem<U>, IDataSourceHelper, new()
where U : EntityObject, new()
...
Рейтинг: 0 / 0
06.06.2014, 16:54
    #38663911
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Lelouchвот так можно:

public class ListModelItemsManager<T, U>
where T : ListRecordItem<U>, IDataSourceHelper, new()
where U : EntityObject, new()
допустим, а как тогда ты предлагаешь объявлять ListModelItemsManager, допустим
есть
Код: c#
1.
2.
public class BankRegistration : ListRecordItem<v_Template_Order>, IDataSourceHelper
{}
...
Рейтинг: 0 / 0
06.06.2014, 16:56
    #38663919
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Lelouch,
В с такой реализацией
Код: c#
1.
2.


объявлял вот так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
readonly ListModelItemsManager<Order> _bankmanagerinstance =  new ListModelItemsManager<Order>();
        public ListModelItemsManager< Order> ThreadSafeBankManager
        {
            get
            {
                return _bankmanagerinstance;
            }
        }
...
Рейтинг: 0 / 0
06.06.2014, 16:57
    #38663922
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
ProgaLelouch,
В с такой реализацией
Код: c#
1.
2.
3.
public class ListModelItemsManager<T>
        where T : GridIBindingListRecordPrototype, IDataSourceHelper, new()
    {


объявлял вот так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
readonly ListModelItemsManager<Order> _bankmanagerinstance =  new ListModelItemsManager<Order>();
        public ListModelItemsManager< Order> ThreadSafeBankManager
        {
            get
            {
                return _bankmanagerinstance;
            }
        }
...
Рейтинг: 0 / 0
06.06.2014, 16:58
    #38663927
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Lelouchвот так можно:

public class ListModelItemsManager<T, U>
where T : ListRecordItem<U>, IDataSourceHelper, new()
where U : EntityObject, new()

с такой реализацией ругается на невозможность приведения типов
...
Рейтинг: 0 / 0
06.06.2014, 16:59
    #38663928
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Proga,
если я правильно понял ваш сбивчивый вопрос, то:

readonly ListModelItemsManager<BankRegistration, v_Template_Order>
...
Рейтинг: 0 / 0
06.06.2014, 17:00
    #38663930
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Proga,

с такой реализацией ругается на невозможность приведения типов - что именно ругается?) какие типы указаны в параметрах?)
...
Рейтинг: 0 / 0
06.06.2014, 17:03
    #38663932
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
LelouchProga,
если я правильно понял ваш сбивчивый вопрос, то:

readonly ListModelItemsManager<BankRegistration, v_Template_Order>
сорри не оттуда вытащил блок кода, там у меня много наследников.
а мне не хочется вытаскивать наружу объект Entity, на базе которого сформирован класс BankRegistration
...
Рейтинг: 0 / 0
06.06.2014, 17:05
    #38663934
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Proga,

ну тогда ваш путь - public class ListModelItemsManager<T> where T : GridIBindingListRecordPrototype, IDataSourceHelper, new()
:)

Для вашего ограничения where T : ListRecordItem<T>, IDataSourceHelper, new()
нужно, чтобы T также отвечал ограничению: where T : EntityObject, new(),
что, соответственно, требует множественного наследования.
...
Рейтинг: 0 / 0
06.06.2014, 17:08
    #38663938
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
LelouchProga,
если я правильно понял ваш сбивчивый вопрос, то:

readonly ListModelItemsManager<BankRegistration, v_Template_Order>
да, такая реализация проходит, но ведь сам BankRegistration знает, о том что он
Код: c#
1.
public class BankRegistration : ListRecordItem<v_Template_nsp_Заявки_в_банк_список_работников>, IDataSourceHelper


изначально то хочется
чтобы было вот так
Код: c#
1.
readonly ListModelItemsManager<BankRegistration> 
...
Рейтинг: 0 / 0
06.06.2014, 17:09
    #38663942
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
LelouchProga,

ну тогда ваш путь - public class ListModelItemsManager<T> where T : GridIBindingListRecordPrototype, IDataSourceHelper, new()
:)

Для вашего ограничения where T : ListRecordItem<T>, IDataSourceHelper, new()
нужно, чтобы T также отвечал ограничению: where T : EntityObject, new(),
что, соответственно, требует множественного наследования.
я так и думал, привык что в плюсах так можно было делать.
...
Рейтинг: 0 / 0
06.06.2014, 17:12
    #38663947
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
LelouchProga,

ну тогда ваш путь - public class ListModelItemsManager<T> where T : GridIBindingListRecordPrototype, IDataSourceHelper, new()
:)

Для вашего ограничения where T : ListRecordItem<T>, IDataSourceHelper, new()
нужно, чтобы T также отвечал ограничению: where T : EntityObject, new(),
что, соответственно, требует множественного наследования.
в этом получаю большую проблему. потому как хотелось вызывать методы
именно класса T в ListModelItemsManager без приведения типа, да и то, вряд ли получиться.
Придётся через интерфейсы видимо копать
...
Рейтинг: 0 / 0
06.06.2014, 17:13
    #38663949
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
ProgaLelouchProga,

ну тогда ваш путь - public class ListModelItemsManager<T> where T : GridIBindingListRecordPrototype, IDataSourceHelper, new()
:)

Для вашего ограничения where T : ListRecordItem<T>, IDataSourceHelper, new()
нужно, чтобы T также отвечал ограничению: where T : EntityObject, new(),
что, соответственно, требует множественного наследования.
в этом получаю большую проблему. потому как хотелось вызывать методы
именно класса T в ListModelItemsManager без приведения типа, да и то, вряд ли получиться.
Придётся через интерфейсы видимо копать

хотя есть ещё решения, но они менее элегантные.
...
Рейтинг: 0 / 0
06.06.2014, 17:16
    #38663953
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
ProgaProgaпропущено...

в этом получаю большую проблему. потому как хотелось вызывать методы
именно класса T в ListModelItemsManager без приведения типа, да и то, вряд ли получиться.
Придётся через интерфейсы видимо копать

хотя есть ещё решение, но они менее элегантные.
для людей, кто в последствие будет интересоваться, это решение через объявление в конструкторе в качестве параметра типа объекта.
...
Рейтинг: 0 / 0
06.06.2014, 17:23
    #38663964
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шаблоны как параметры шаблона
Proga,

ну если не ставить во главу угла сокрытие типа сущности, то можно описать ListModelItemsManager как
Код: c#
1.
public class ListModelItemsManager<TEntity> where TEntity : EntityObject, new()


и, например, воспользоваться IoC контейнером:
Код: c#
1.
2.
3.
4.
5.
// Где-то в коде:
container.Register<ListRecordItem<Order>, OrderListRecordItem>();
....
// Внутри ListModelItemsManager<TEntity>
var newRecordItem = container.Resolve<ListRecordItem<TEntity>>();



Методы ListModelItemsManager<TEntity>, возвращающие и принимающие тип T должны изменить его на ListModelItemsManager<TEntity>

P.S. Если внутри ListModelItemsManager в создании новых объектов нет нужды, то IoC контейнер не нужен.
P.P.S. Второй способ избежать его использования: сделать ListModelItemsManager абстрактным и добавить в него метод:
abstract ListRecordItem<TEntity> CreateNewItem() (соответствующим образом переопределяя его в потомках)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Шаблоны как параметры шаблона / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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