Модератор
Эксперт .NET
15045 / 10271 / 2708
Регистрация: 21.04.2018
Сообщений: 30,458
Записей в блоге: 2
1

Ограничения типа в обобщённом интерфейсе ICopy<T>

02.07.2019, 11:03. Показов 1833. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал такой интерфейс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    /// <summary>Интерфейс для создания копии экземпляра того же типа
    /// и копирования значений в другой или из другого экземпляра</summary>
    /// <typeparam name="T"></typeparam>
    public interface ICopy<T> : ICloneable
    {
        /// <summary>Создание копии экземпляра</summary>
        /// <returns>Новый экземпляр в том же типе</returns>
        T Copy();
 
        /// <summary>Создание копии экземпляра</summary>
        /// <returns>Новый экземпляр в заданном типе</returns>
        T Copy(Type type);
 
        /// <summary>Копирование значений экземпляра в другой экземпляр</summary>
        /// <param name="other">Другой экземпляр в который надо скопировать значения</param>
        void CopyTo(T other);
 
        /// <summary>Копирование значений экземпляра из другого экземпляра</summary>
        /// <param name="other">Другой экземпляр из которого надо скопировать значения</param>
        void CopyFrom(T other);
 
    }
И что-то ни как сообразить не могу как правильно задать ограничения (если возможно) для типа в методе T Copy(Type type);, чтобы type был производным от T

Напрашивается вариант public interface ICopy<T, T1> : ICloneable where T1 : T
, но как привязать type к T1? Как-то так (нерабочий) T Copy(T1);?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2019, 11:03
Ответы с готовыми решениями:

Применение ковариантности в обобщенном интерфейсе
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Как в обобщенном методе указать ограничения для конструктора?
Вот например я хочу создать Класс в котором я буду в основном работать с двумя типами, один из...

Компилятор не видит шаблонный параметр T внутри анонимного типа записи в обобщенном классе
type TExample&lt;T&gt; = class fX: record x: T; end; end; begin end....

Массив типа char без ограничения
Помогите создать массив именно типа char без четкого ограничения. Мне говорили, что это можно...

8
692 / 509 / 238
Регистрация: 02.10.2012
Сообщений: 1,737
02.07.2019, 11:13 2
не?
C#
1
2
3
4
public interface ICopy<T,T1> : ICloneable where T1 : T
        {
            T Copy(T1 type);
}
0
Модератор
Эксперт .NET
15045 / 10271 / 2708
Регистрация: 21.04.2018
Сообщений: 30,458
Записей в блоге: 2
02.07.2019, 11:27  [ТС] 3
Цитата Сообщение от Immo Посмотреть сообщение
не?
Тогда в параметрах метода надо будет передавать не тип, а экземпляр типа.
Для этого в интерфейсе есть метод void CopyTo(T other);
0
Эксперт .NET
17351 / 12760 / 3340
Регистрация: 17.09.2011
Сообщений: 21,041
02.07.2019, 11:34 4
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

C#
1
T Copy<TClone>() where TClone : T
Вызываться будет так (предполагая, что MyDerivedClass реализует интерфейс):
C#
1
2
var myInstance = new MyBaseClass();
var clone = myInstance.Copy<MyDerivedClass>();
1
Модератор
Эксперт .NET
15045 / 10271 / 2708
Регистрация: 21.04.2018
Сообщений: 30,458
Записей в блоге: 2
02.07.2019, 11:40  [ТС] 5
Цитата Сообщение от Immo Посмотреть сообщение
не?
Сейчас для создания копии нужного типа приходится делать так
C#
1
2
3
4
5
6
7
8
9
10
11
12
class BasCl : ICopy {}
class DerCl : BasCl{}
 
BasCl bas = new BasCl();
 
/// Так сейчас
DerCl der = new DerCl();
bas.CopyTo(der);
 
/// А хочется какой-то из этих вариантов
DerCl der = bas.Copy(typeof(DerCl));
DerCl der = bas.Copy<>(DerCl);
0
Модератор
Эксперт .NET
15045 / 10271 / 2708
Регистрация: 21.04.2018
Сообщений: 30,458
Записей в блоге: 2
02.07.2019, 11:48  [ТС] 6
kolorotur, СПАСИБО!

Вот то что тип и ограничения можно указать при объявлении метода в голову не пришло.
Затупил!
0
Модератор
Эксперт .NET
15045 / 10271 / 2708
Регистрация: 21.04.2018
Сообщений: 30,458
Записей в блоге: 2
02.07.2019, 12:07  [ТС] 7
kolorotur, ещё такой вопрос ограничение new() может быть только без параметров?
0
Эксперт .NET
17351 / 12760 / 3340
Регистрация: 17.09.2011
Сообщений: 21,041
02.07.2019, 12:48 8
Цитата Сообщение от Элд Хасп Посмотреть сообщение
ограничение new() может быть только без параметров?
Да.

Если нужно с параметрами, то уберите ограничение и добавьте параметром делегат/класс-фабрику:
C#
1
T Copy<TClone>(Func<Param1Type, Param2Type, TClone> factory);
0
Модератор
Эксперт .NET
15045 / 10271 / 2708
Регистрация: 21.04.2018
Сообщений: 30,458
Записей в блоге: 2
02.07.2019, 13:22  [ТС] 9
Цитата Сообщение от kolorotur Посмотреть сообщение
Да.
Если нужно с параметрами, то уберите ограничение и добавьте параметром делегат/класс-фабрику:
Жаль.
Параметры в методе это понятно, но немного не то.
Лучше открою в классах конструктор по умолчанию.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2019, 13:22
Помогаю со студенческими работами здесь

В чём смысл ограничения параметра типа базовым классом? Generics Base class constraint
public class A { public virtual void F() =&gt; Console.WriteLine(&quot;AAA&quot;); ...

Каскадное удаление при передаче обновлений в базу данных в случае ограничения типа "слоновье ухо"
Здравствуйте, господа. Возник вопрос - может кто подсткажет? В технологии ADO.NET как решается...

Null в обобщенном типе
Здравствуйте, подскажите как вернуть null во втором перегруженном методе Get (50 строка) using...

Сопоставление ограничения, введенного без указания имени ограничения, и имени соответствующего столбца средствами SSMS
Если для какого-то столбца введено ограничение UNIQUE или DEFAULT без явного указания имени...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru