Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
leofun01
6 / 6 / 1
Регистрация: 04.05.2012
Сообщений: 36
#1

Как наследовать два одинаковых интерфейса с разными параметрами?

01.03.2014, 09:01. Просмотров 1054. Ответов 9
Метки нет (Все метки)

Как наследовать "IEquatable<T1>" и "IEquatable<T2>" ? (C#)
C#
1
2
3
4
5
6
7
8
9
10
public class A<T1, T2> : IEquatable<T1>, IEquatable<T2>
    where T2 : A<T1, T2>
{
    public T1 Data;
    public T2 Link;
    public A() { }
    public A(T1 d, T2 l = null) { Data = d; Link = l; }
    public bool Equals(T1 other) { return Equals(Data, other); }
    public bool Equals(T2 other) { return Equals(other.Data); }
}
Как мне об'яснить компилятору, что "T1" и "T2" никогда не будут одинаковы ?
0
Миниатюры
Как наследовать два одинаковых интерфейса с разными параметрами?  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 09:01
Ответы с готовыми решениями:

Запустить функцию в разных потоках с разными параметрами
Здравствуйте, подскажите как запустить 1 и ту же функцию в разных потоках с...

Множество одинаковых объектов с разными свойствами
День добрый Столкнулся с некоторой проблемой на уровне теории. В следствии...

Как создать два динамических пикчибокса с двумя разными именами, обзятательно если кол-во пикчейбоксов неограничено
Как создать два динамических пикчибокса с двумя разными именами, ОБЯЗАТЕЛЬНО...

Создать множество одинаковых переменных с разными именами
Уже 2 дня ломаю голову, как создать одинаковые переменные типа double name_1...

Объявить два интерфейса. Объявить два класса, первый из которых реализует один из интерфесов, а второй - оба
Помогите написать программу,несеку фишку.Объявить два интерфейса. Объявить два...

9
tezaurismosis
Администратор
Эксперт .NET
8482 / 3809 / 723
Регистрация: 17.04.2012
Сообщений: 8,507
Записей в блоге: 14
01.03.2014, 09:40 #2
leofun01, это вы никогда не передадите им одинаковые типы, а другой пользователь вашего кода может легко и просто передать два одинаковых типа. Поэтому компилятор и отказывается от такой идеи.
Предлагаю оставить IEquatable для вашего типа, а для всех остальных использовать Equals(object)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class A<T1, T2> : IEquatable<T2>
where T2 : A<T1, T2>
{
    public T1 Data;
    public T2 Link;
    public A() { }
    public A(T1 d, T2 l = null) { Data = d; Link = l; }
    public bool Equals(T2 other) { return Equals(other.Data); }
 
    public override bool Equals(object obj) {
        return Equals((T2)obj);
    }
}
Примерно так. И перегрузите GetHashCode()
1
leofun01
6 / 6 / 1
Регистрация: 04.05.2012
Сообщений: 36
01.03.2014, 09:49  [ТС] #3
Может есть какой-то способ оставить оба интефейса ?
Может с помощю where ? , както подобно этому:
C#
1
2
3
public class A<T1, T2> : IEquatable<T1>, IEquatable<T2>
    where T2 : A<T1, T2>
    where T1 != T2 :)
0
Grishaco
436 / 360 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
01.03.2014, 09:50 #4
Лучший ответ Сообщение было отмечено leofun01 как решение

Решение

А если через посредника

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
public class A<T1, T2> : IEquatable<T1>
        where T2 : A<T1, T2>
    {
        public T1 Data;
 
        #region IEquatable<T1> Members
 
        public bool Equals(T1 other)
        {
            return Equals(Data, other);
        }
 
        #endregion
    }
 
    internal class AImpl<T1, T2> : A<T1, T2>, IEquatable<T2> where T2 : A<T1, T2>
    {
        public T2 Link;
 
        public AImpl()
        {
        }
 
        public AImpl(T1 d, T2 l = null)
        {
            Data = d;
            Link = l;
        }
 
        #region Implementation of IEquatable<T2>
        
        public bool Equals(T2 other)
        {
            throw new NotImplementedException();
        }
 
        #endregion
    }
1
leofun01
6 / 6 / 1
Регистрация: 04.05.2012
Сообщений: 36
01.03.2014, 10:12  [ТС] #5
Спасибо, это сработало
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class A<T1, T2> : IEquatable<T1>
    where T2 : A<T1, T2>
{
    public T1 Data;
    public T2 Link;
    public A() { }
    public A(T1 d, T2 l = null) { Data = d; Link = l; }
 
    public bool Equals(T1 other) { return Equals(Data, other); }
    public bool Equals(T2 other) { return Equals(other.Data); }
}
public class B<T1, T2> : A<T1, T2>, IEquatable<T2>
    where T2 : A<T1, T2>
{
    public B() { }
    public B(T1 d, T2 l = null) : base(d, l) { }
}
Но я никак немогу понять, чем этот код лучше первого ?
0
Grishaco
436 / 360 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
01.03.2014, 10:25 #6
Цитата Сообщение от leofun01 Посмотреть сообщение
Но я никак немогу понять, чем этот код лучше первого ?
Для меня это тоже загадка, почему я не могу сделать так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public interface a<T>
    {
        void Go(T t);
    }
 
    public class AA<T1,T2>:a<T1>,a<T2>
    {
        void a<T1>.Go(T1 t)
        {
            throw new NotImplementedException();
        }
 
        void a<T2>.Go(T2 t)
        {
            throw new NotImplementedException();
        }
    }
По ходу ограничение компилятора.
1
Psilon
Master of Orion
Эксперт .NET
5998 / 4848 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
01.03.2014, 12:20 #7
Эрик негодует
http://stackoverflow.com/questions/7...-they-derive-f
2
leofun01
6 / 6 / 1
Регистрация: 04.05.2012
Сообщений: 36
01.03.2014, 19:56  [ТС] #8
Это что ж получается, те кто создавал C#, просто обкурились там, когда проектировали этот язик ?

У меня реально есть потребность реализации нескольких интерфейсов.
Может вы знаете кого нибудь из компании Microsoft, с кем можно было бы потолковать об этом ?
0
Петррр
6159 / 3459 / 897
Регистрация: 28.10.2010
Сообщений: 5,926
01.03.2014, 20:00 #9
Цитата Сообщение от leofun01 Посмотреть сообщение
Может вы знаете кого нибудь из компании Microsoft, с кем можно было бы потолковать об этом ?
leofun01, напиши мне завтра. Мы сейчас Хейлсбергом вискарь пьем, сейчас еще девочек закажем. Короче, он сказал завтра.
1
Grishaco
436 / 360 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
01.03.2014, 20:16 #10
Лучший ответ Сообщение было отмечено leofun01 как решение

Решение

Цитата Сообщение от leofun01 Посмотреть сообщение
Это что ж получается, те кто создавал C#, просто обкурились там, когда проектировали этот язик ?
Это еще не все, я тут немного поэксперементировал и вот что получилось

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
internal interface IABC{}
 
    internal interface IDEF{}
 
    internal interface IABCDEF : IDEF, IABC{}
 
    public interface IA<in T>
    {
        void Go(T t);
    }
 
    public class AA1<T1, T2> : IA<T1>
    {
        public void Go(T1 t1){}
        public void Go(T2 t2){}
    }
 
    public class AA2<T1, T2> : AA1<T1, T2>, IA<T2>{}
 
private static void Main(string[] args)
        {
            IA<IABCDEF> crazy = new AA1<IDEF, IABC>();
            crazy.Go(null);
 
            Console.WriteLine("Press any key ...");
            Console.ReadKey();
        }
Как такое возможно для меня загадка, а зачем нужно тем более. Кто нить может объяснить как получилась ссылка вот такого типа IA<IABCDEF>?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Петррр Посмотреть сообщение
Мы сейчас Хейлсбергом вискарь пьем, сейчас еще девочек закажем. Короче, завтра.
Много не пейте, а то придется отложить до понедельника :D

1
01.03.2014, 20:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2014, 20:16

Как наследовать и переопределить метод?
Доброго времени суток! Такой вопрос - можно ли наследовать метод и при этом...

Как наследовать сразу 2 класса?
У меня есть 3 класса для игры &quot;Симулятор бомжа&quot; - Car ( Автомобиль ) Person (...

Как правильно наследовать несколько элементов
Вот код: #region Directives using System; using System.Drawing; using...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru