powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Комбинирование интерфейсов
65 сообщений из 65, показаны все 3 страниц
Комбинирование интерфейсов
    #38963409
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  public interface IHasCreator
  {
    IUser Creator { get; set; }
  }

  public class Foo : IHasCreator
  {
    public User Creator { get; set; }
  }

  public interface IUser { }
  
  public class User : IUser { }



Конструкция не компилируется:
'Foo.Creator' cannot implement 'IHasCreator.Creator' because it does not have the matching return type of 'IUser'
Почему так? Что я недопонял?
Можно ли тут что-то сделать, с учетом того, что код класса Foo я менять не могу?
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963423
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProМожно ли тут что-то сделать, с учетом того, что код класса Foo я менять не могу?
кастрировать автора класса Foo
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963424
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилкастрировать автора класса Fooсложно, это кодогенератор )))

Попробую вот так выйти из положения:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  public interface IHasCreator<T>
    where T : User
  {
    T Creator { get; set; }
  }

  public class Foo : IHasCreator<User>
  {
    public User Creator { get; set; }
  }

  public interface IUser { }

  public class User : IUser { }

по крайней мере компиляция проходит
(забыл сказать, Foo объявлен как partial, и интерфейс ему приписываю я сам)
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963461
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИзопропилкастрировать автора класса Fooсложно, это кодогенератор )))

Попробую вот так выйти из положения:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  public interface IHasCreator<T>
    where T : User
  {
    T Creator { get; set; }
  }

  public class Foo : IHasCreator<User>
  {
    public User Creator { get; set; }
  }

  public interface IUser { }

  public class User : IUser { }

по крайней мере компиляция проходит
(забыл сказать, Foo объявлен как partial, и интерфейс ему приписываю я сам)дык пропишите тогда и явную реализацию интерфейса
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963542
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, я могу только вот так сделать:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
// кодогенератор
  public partial class Foo
  {
    public User Creator { get; set; }
  }
// я
  public partial class Foo : IHasCreator<User>
  {
  }
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963630
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПочему так? Что я недопонял?и он еще спрашивает. в интерфейсе свойство возвращает тип IUser, а в реализации ты кодогенератор подсовывает User. ничо, что это разные типы, на минуточку? а интерфейс определяет тип ЖОСКА!

что за говно у тебя занимается генерацией кода, что ты не можешь на него влиять?
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963645
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyи он еще спрашивает. в интерфейсе свойство возвращает тип IUser, а в реализации ты кодогенератор подсовывает User. ничо, что это разные типы, на минуточку? а интерфейс определяет тип ЖОСКА!Поскольку User реализует IUser, не понимаю, почему бы это не разрешить.
Antonariyчто за говно у тебя занимается генерацией кода, что ты не можешь на него влиять?EF в режиме DBFirst
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963686
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyи он еще спрашивает. в интерфейсе свойство возвращает тип IUser, а в реализации ты кодогенератор подсовывает User. ничо, что это разные типы, на минуточку? а интерфейс определяет тип ЖОСКА!Поскольку User реализует IUser, не понимаю, почему бы это не разрешить.Не понимаешь, потому что ты тупо ниасилил интерфейсы.

Еще раз: User и IUser это РАЗНЫЕ типы. Не один и тот же тип, как требует смысл интерфейсов, а два отдельных типа. С разными названиями. И пофиг, какие там у них взаимные отношения, интерфейс IHasCreator это не колышет, ему нужен User, и точка.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963707
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

User может быть неявно приведен к IUser

Посему не понимаю, какое техническое или логическое ограничение может быть на такое использование. Обычно на подобные ограничения существуют причины. Я могу принять это как данность, но если буду знать причину, будет легче жить
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963708
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProEF в режиме DBFirstтак он все правильно делает.

непонятно тогда, откуда это взялось? он этим не занимается.

Код: c#
1.
public class Foo : IHasCreator
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963710
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyинтерфейс IHasCreator это не колышет, ему нужен User, и точка.
ты хотел сказать IUser наварное.
вообще зачем тогда городить интерфейсы? получается в данном случае, что IUser вообще нафиг не нужен.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963716
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariy,

User может быть неявно приведен к IUser

Посему не понимаю, какое техническое или логическое ограничение может быть на такое использование. Обычно на подобные ограничения существуют причины. Я могу принять это как данность, но если буду знать причину, будет легче жить
потому, что в интерфейсе определено поле с интерфейсом IUser, а это значит, что там может возвращаться любой класс наследующий интерфейс IUser, а не только User.
проще говоря интерфейс предполагает в поле Creator любой класс наследующий IUser, а класс наследник этого интерфейса, что только 1 класс может быть возвращен. То есть, если я создам класс на базе интерфейса IUser отличный от класс User, как будет происходить преобразование типа?
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963717
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyShocker.ProEF в режиме DBFirstтак он все правильно делает.

непонятно тогда, откуда это взялось? он этим не занимается.

Код: c#
1.
public class Foo : IHasCreator

Это я ему придаю (см. выше), чтобы некий библиотечный код, не имеющий зависимости от проекта, где находится EF, мог делать некоторые типовые действия с его объектами через интерфейсы, объявленные в библиотеке.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963722
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariy,

User может быть неявно приведен к IUser

Посему не понимаю, какое техническое или логическое ограничение может быть на такое использование. Обычно на подобные ограничения существуют причины. Я могу принять это как данность, но если буду знать причину, будет легче жить Ты тупой?
причина в том, что это данность. Интерфейсы работают так и никак иначе. В реализации ДОЛЖЕН использоваться указанный в интерфейсе тип, а никакой не производный или первообразный. Именно этот смысл вложен в понятие "интерфейс". А компилятор, исполняя этот смысл, просто сравнивает названия типов и не лезет в дебри их взаимосвязей.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963725
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesAntonariyинтерфейс IHasCreator это не колышет, ему нужен User, и точка.
ты хотел сказать IUser наварное.да
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963732
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

ну, взять для примера тот факт, что компилятор вообще не парится и скомпилирует такой код.

я получаю объект и привожу его к типу IHasCreator. У объекта есть поле Creator типа IUser, я создаю класс Ololo : IUser {} на базе IUser и присваиваю его экземпляр этому полю. Думаю после такой манипуляции (если бы такое вообще было возможно) я бы получил исключение :) из института сразу :)
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963760
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyпропущено...
так он все правильно делает.

непонятно тогда, откуда это взялось? он этим не занимается.

Код: c#
1.
public class Foo : IHasCreator

Это я ему придаю (см. выше)А еще ты не осилил слово partial.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//кодогенератор
public partial class Foo 

//ты
public interface IUser { }
public class User : IUser { }
public interface IHasCreator
  {
    IUser Creator { get; set; }
  }

public partial class Foo : IHasCreator

и будет щастье
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963770
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а хотя я кажется тупанул, ты же хочешь не просто вернуть User, а задекларировать его. слово partial тут не спасет.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963780
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто без него все равно не взлетело бы, но из-за другой ошибки.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963783
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА еще ты не осилил слово partial.попробуй осилить, все, что я пишу, а не через одно 17664775



Я уже написал способ, которым я могу решить свою задачу 17664287 , далее хотел только разобраться в причинах, Roman Mejtes объяснил (благодарю покорнейше), а ты продолжаешь что-то свое обсасывать.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38963792
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, увлекся
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964111
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

С пропертями понятно. А вот почему аналогичный код с методами не компилируется?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    public interface IHasCreator
    {
        IUser Creator();
    }

    public class Foo : IHasCreator
    {
        public User Creator()
        {
            return new User();
        }
    }

    public interface IUser { }

    public class User : IUser { }



Тут-то точно типы совместимы на выходе.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964120
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезRoman Mejtes,

С пропертями понятно. А вот почему аналогичный код с методами не компилируется?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    public interface IHasCreator
    {
        IUser Creator();
    }

    public class Foo : IHasCreator
    {
        public User Creator()
        {
            return new User();
        }
    }

    public interface IUser { }

    public class User : IUser { }



Тут-то точно типы совместимы на выходе.еще один...



тип должен бы не "совместимым", а ТЕМ ЖЕ САМЫМ

и не важно, свойство это, метод или параметр метода.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964121
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,
Код: c#
1.
2.
3.
4.
5.
6.
7.
  public class Foo : IHasCreator
    {
        public IUser Creator()
        {
            return new User();
        }
    }


?
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964124
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, опоздал...
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964136
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronДиез,
Код: c#
1.
2.
3.
4.
5.
6.
7.
  public class Foo : IHasCreator
    {
        public IUser Creator()
        {
            return new User();
        }
    }


?это не ошибка, это искреннее желание, чтобы работало именно так - public User.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964169
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

В случае со свойством - был приведен конкретный пример 17665356 , когда контракт нарушается.


Для метода такой пример не годится - User подходит при любом использовании (return-типы ковариантнты - нет?).
Тогда зачем ограничивать возврат конкретным типом, если подходит любой наследник?
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964172
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,

потому что "пропертя" это на самом деле два обычных метода, а значит и суть дела это не меняет :)
Код: c#
1.
2.
set_Creator(User value) {}
User get_Creator() {}
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964184
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesДиез,

потому что "пропертя" это на самом деле два обычных метода, а значит и суть дела это не меняет :)
Код: c#
1.
2.
set_Creator(User value) {}
User get_Creator() {}



В случае со свойством нарушается как раз контракт set-метода, и это понятно.
get-метод допускает возврат User вместо IUser в любых случаях. Просто метод IUset creator() - тоже.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964197
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезAntonariy,

В случае со свойством - был приведен конкретный пример 17665356 , когда контракт нарушается.


Для метода такой пример не годится - User подходит при любом использовании (return-типы ковариантнты - нет?).
Тогда зачем ограничивать возврат конкретным типом, если подходит любой наследник?ты реально не догоняешь, что все эти слова мимо кассы?

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

все эти вопросы "зачем" из разряда попыток оспорить уголовный кодекс. не нравятся или не понимаешь правил ООП - пиши на js или асемблере.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964232
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДиезAntonariy,

В случае со свойством - был приведен конкретный пример 17665356 , когда контракт нарушается.


Для метода такой пример не годится - User подходит при любом использовании (return-типы ковариантнты - нет?).
Тогда зачем ограничивать возврат конкретным типом, если подходит любой наследник?ты реально не догоняешь, что все эти слова мимо кассы?

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

все эти вопросы "зачем" из разряда попыток оспорить уголовный кодекс. не нравятся или не понимаешь правил ООП - пиши на js или асемблере.

Давайте без перехода на личности, ок? :)

Насчет "понимания принципов ООП" - объясните тогда, плз, почему в Java аналогичный фокус работает?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public interface IUser {

}

public class User implements IUser {

}

public interface IHas {

	IUser creator();
}

public class Foo implements IHas {

	@Override
	public User creator() {
		return new User();
	}
}


Компилируется без проблем.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964266
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,
Пойми, что интерфейсам абсолютно по барабану, что вот этот его член, являющийся интерфейсом, имплементирован в том или ином классе.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964271
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самый точный ответ будет: "Потому что" :)
потому что, так решили разрабы в МС и как по мне такое решение вполне логично и верно.
если так сильно прижало, можно наследовать интерфейс в абстрактном классе, а потом через new переопределить этот метод на метод с типом User и радоваться жизни
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964273
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез Давайте без перехода на личности, ок? :)пока что я про личность ничего не сказал.
Диез почему в Java аналогичный фокус работает?@Override - это называется аналогичный? без него же не компилится, да?
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964288
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesсамый точный ответ будет: "Потому что" :)
потому что, так решили разрабы в МС и как по мне такое решение вполне логично и верно.
если так сильно прижало, можно наследовать интерфейс в абстрактном классе, а потом через new переопределить этот метод на метод с типом User и радоваться жизни

Спасибо, уже разобрался :)
http://blogs.msdn.com/b/cyrusn/archive/2004/12/08/278661.aspx

Фича действительно мало востребованная, судя по тому, что этот вопрос у меня только сейчас возник.

Посмотрел как ее в Nemerle реализовали без поддержки CLR:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
internal class Foo : IHasCreator
{
	public User Creator()
	{
		return new User();
	}
	IUser IHasCreator.Creator()
	{
		return this.Creator();
	}
}


Элегантно :)
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964297
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДиез Давайте без перехода на личности, ок? :)пока что я про личность ничего не сказал.
Диез почему в Java аналогичный фокус работает?@Override - это называется аналогичный? без него же не компилится, да?

У вас есть привычка - вы считаете по умолчанию, что оппонент хуже вас разбирается в теме, если задает вопросы.
Зря вы так ))
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964302
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
википедияИспользование интерфейсов возможно двумя способами:

Класс может реализовывать интерфейс. Реализация интерфейса заключается в том, что в описании класса данный интерфейс указывается как реализуемый, а в коде класса обязательно определяются все методы, которые описаны в интерфейсе, в полном соответствии с сигнатурами из описания этого интерфейса . То есть, если класс реализует интерфейс, для любого экземпляра этого класса существуют и могут быть вызваны все описанные в интерфейсе методы. Один класс может реализовать несколько интерфейсов одновременно.

Возможно объявление переменных и параметров методов как имеющих тип-интерфейс. В такую переменную или параметр может быть записан экземпляр любого класса, реализующего интерфейс. Если интерфейс объявлен как тип возвращаемого значения функции, это означает, что функция возвращает объект класса, реализующего данный интерфейс.а разработчики java просто решили дать разработчику выстрелить себе в ногу с помощью @Override. фича-то оказалась востребованной.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964324
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy...
Диез почему в Java аналогичный фокус работает?@Override - это называется аналогичный? без него же не компилится, да?

Прекрасно компилируется!

Код: java
1.
2.
3.
4.
5.
6.
7.
public class Foo implements IHasCreator {

	public User creator() {
		return new User();
	}
}
}
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964325
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезAntonariyпропущено...
пока что я про личность ничего не сказал.
пропущено...
@Override - это называется аналогичный? без него же не компилится, да?

У вас есть привычка - вы считаете по умолчанию, что оппонент хуже вас разбирается в теме, если задает вопросы.
Зря вы так ))это умолчание? 17666424
или может быть это? 17666660

нет, оппонент не молчал, он активно демонстрировал свой невысокий уровень владения темой.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964333
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезAntonariy...
пропущено...
@Override - это называется аналогичный? без него же не компилится, да?

Прекрасно компилируется!

Код: java
1.
2.
3.
4.
5.
6.
7.
public class Foo implements IHasCreator {

	public User creator() {
		return new User();
	}
}
}

ну значит я ошибся насчет назначения этого overrides, а java является еще большим убожеством, чем мне казалось ранее, раз позволяет такие вольности.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964349
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy...ну значит я ошибся ...

Уже прогресс Удачи!
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964355
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезУже прогресс Удачи!
И что ты этим кому доказал? Тебе Antonariy все на пальцах расписал и не поленился. А ты не только Java не знаешь, но и элементарных основ C#. Но сегодня, надеюсь, ты усвоил урок 5: "Интерфейсы". Уже прогресс. Удачи!
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964372
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезAntonariy...ну значит я ошибся ...

Уже прогресс Удачи!пфф, какую ерунду мои оппоненты считают прогрессом. наверное по себе судят?

я всегда признаю свои промахи.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964476
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronДиезУже прогресс Удачи!
И что ты этим кому доказал? Тебе Antonariy все на пальцах расписал и не поленился. А ты не только Java не знаешь, но и элементарных основ C#. Но сегодня, надеюсь, ты усвоил урок 5: "Интерфейсы". Уже прогресс. Удачи!

Переформулирую свой первоначальный вопрос более абстрактно: почему в C# нарушается принцип Return Type Covariance, который соблюдается в других языках с ООП, с которыми я знаком(по крайней мере, в Java, Scala, Nemerle)?

Вижу, что вы этим вопросом не интересовались. Ну что ж, это не дает мне повод считать, что вы не разбираетесь в основах ООП. У каждого свои интересы.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964490
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,
Почему Вы уверены, что все языки программирования должны быть одинаковыми и иметь одинаковые инструменты, возможности и функционал?
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964512
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезAxeleronпропущено...

И что ты этим кому доказал? Тебе Antonariy все на пальцах расписал и не поленился. А ты не только Java не знаешь, но и элементарных основ C#. Но сегодня, надеюсь, ты усвоил урок 5: "Интерфейсы". Уже прогресс. Удачи!

Переформулирую свой первоначальный вопрос более абстрактно: почему в C# нарушается принцип Return Type Covariance, который соблюдается в других языках с ООП, с которыми я знаком(по крайней мере, в Java, Scala, Nemerle)?

Вижу, что вы этим вопросом не интересовались.
Что характерно, ответ был дан еще до того, как был задан вопрос: 17665335
Antonariyпричина в том, что это данность. Интерфейсы работают так и никак иначе. http://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance This kind of covariance is not supported in C#, and is unlikely to ever be supported. It is not supported by the CLR. чем я в действительности не интересовался, так этой ковариантностью.

и ошибся в том, что это способ выстрелить себе в ногу.
This is safe because consumers of Contents via Enclosure expect an Animal, and Aquarium promises to not only fulfill that requirement, but moreover, to make a more strict promise: that the animal is always a fish.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964519
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronДиез,
Почему Вы уверены, что все языки программирования должны быть одинаковыми и иметь одинаковые инструменты, возможности и функционал?

А я ничего подобного не утверждал.
Вопрос "почему?" для меня имеет смысл "по какой причине?". Для вас, видимо, смысл другой - "какого хрена?"

Извечная проблема неоднозначности естественных языков.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964521
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДиезпропущено...


Переформулирую свой первоначальный вопрос более абстрактно: почему в C# нарушается принцип Return Type Covariance, который соблюдается в других языках с ООП, с которыми я знаком(по крайней мере, в Java, Scala, Nemerle)?

Вижу, что вы этим вопросом не интересовались.
Что характерно, ответ был дан еще до того, как был задан вопрос: 17665335
Antonariyпричина в том, что это данность. Интерфейсы работают так и никак иначе. http://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance This kind of covariance is not supported in C#, and is unlikely to ever be supported. It is not supported by the CLR. чем я в действительности не интересовался, так этой ковариантностью.

и ошибся в том, что это способ выстрелить себе в ногу.
This is safe because consumers of Contents via Enclosure expect an Animal, and Aquarium promises to not only fulfill that requirement, but moreover, to make a more strict promise: that the animal is always a fish.

Простите, мне, сложно всерьез воспринимать информацию, которая начинается со слов "ты тупой?".
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964522
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез,
Нет, я именно спросил то что хотел - почему вы считаете (уверены), что все языки программирования должны быть одинаковыми? Мне стало интересно.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964531
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronДиез,
Нет, я именно спросил то что хотел - почему вы считаете (уверены), что все языки программирования должны быть одинаковыми? Мне стало интересно.

Видимо, вам и ответить придется самому, потому что я так не считаю.

Есть общие принципы, общие конструкции, концепции. Общие для разных языков. И если в каком-то из ЯП поведение отличает от остальных, возникает вопрос - каковы объективные причины такого поведения. .NET разрабатывали неглупые люди, видимо были на то причины.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964535
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезЕсть общие принципы, общие конструкции, концепции. Общие для разных языков.
Вы правы, есть: наследование, полиморфизм, абстракция, инкапсуляция.

Диез.NET разрабатывали неглупые люди, видимо были на то причины.
Ответы: Да и да.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964948
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy@Override - это называется аналогичный? без него же не компилится, да?
В Java все методы виртуальные, аннотация (скоммуниздили с .NET аттрибуты) @Override лишь показывает, что мы действительно хотим переопределить метод родителя и компилятор должен проверить наличие у родителя метода с таким именем и сигнатурой, отличает override от overload.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38964988
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж заговорили про ко/конрвариантность, значить созрели.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   public interface IUser
        { }

        public class User : IUser { }
        public interface IHasCreator1<in T> where T:IUser
        {
            T Creator { set;  }
        }
        public interface IHasCreator2<out T> where T:IUser
        {
            T Creator { get; } 
        }

        public class Foo : IHasCreator1<User>, IHasCreator2<User>
        {
            public User Creator { get; set; }
        }
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38965009
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВРаз уж заговорили про ко/конрвариантность, значить созрели.а смысл разделять их на два интерфейса? 17664287 (там у меня опечатка, естественно, where T : I User)
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38965038
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЕвгенийВРаз уж заговорили про ко/конрвариантность, значить созрели.а смысл разделять их на два интерфейса? 17664287 (там у меня опечатка, естественно, where T : I User)
Я про "нарушение" принципа "Return Type Covariance" в C#.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38965925
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезRoman Mejtesсамый точный ответ будет: "Потому что" :)
потому что, так решили разрабы в МС и как по мне такое решение вполне логично и верно.
если так сильно прижало, можно наследовать интерфейс в абстрактном классе, а потом через new переопределить этот метод на метод с типом User и радоваться жизни

Спасибо, уже разобрался :)
http://blogs.msdn.com/b/cyrusn/archive/2004/12/08/278661.aspx

Фича действительно мало востребованная, судя по тому, что этот вопрос у меня только сейчас возник.

Посмотрел как ее в Nemerle реализовали без поддержки CLR:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
internal class Foo : IHasCreator
{
	public User Creator()
	{
		return new User();
	}
	IUser IHasCreator.Creator()
	{
		return this.Creator();
	}
}


Элегантно :)Мда, я еще на первой страницу предложил использовать явную реализацию интерфейса.
Оказываются некоторые не знают, что это такое, хотя в любой книжке вроде рассказывается.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38965937
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЕвгенийВРаз уж заговорили про ко/конрвариантность, значить созрели.а смысл разделять их на два интерфейса? 17664287 (там у меня опечатка, естественно, where T : I User)все дело в модификаторах:
in (Generic Modifier) (C# Reference)
out (Generic Modifier) (C# Reference)
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38965978
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAДиезпропущено...


Спасибо, уже разобрался :)
http://blogs.msdn.com/b/cyrusn/archive/2004/12/08/278661.aspx

Фича действительно мало востребованная, судя по тому, что этот вопрос у меня только сейчас возник.

Посмотрел как ее в Nemerle реализовали без поддержки CLR:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
internal class Foo : IHasCreator
{
	public User Creator()
	{
		return new User();
	}
	IUser IHasCreator.Creator()
	{
		return this.Creator();
	}
}


Элегантно :)Мда, я еще на первой страницу предложил использовать явную реализацию интерфейса.
Оказываются некоторые не знают, что это такое, хотя в любой книжке вроде рассказывается.

Это, видимо, в мой огород камешек? :)
Про явную реализацию интерфейсов я знаю, конечно. Вопрос был в другом - ковариантность return-типов не реализована на уровне CLR ( http://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance/5709191#5709191 ), но в Nemerle (который тоже поверх CLR) она присутствует.
Мне стало интересно, как они это реализовали. Оказалось, совсем просто; тем же методом, который вы предлагали.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38965982
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезskyANAпропущено...
Мда, я еще на первой страницу предложил использовать явную реализацию интерфейса.
Оказываются некоторые не знают, что это такое, хотя в любой книжке вроде рассказывается.

Это, видимо, в мой огород камешек? :)
Про явную реализацию интерфейсов я знаю, конечно. Вопрос был в другом...Может стоило прямо вопрос задать? Изначально он был таков: 17666424 :)
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38965983
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38965984
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВРаз уж заговорили про ко/конрвариантность, значить созрели.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   public interface IUser
        { }

        public class User : IUser { }
        public interface IHasCreator1<in T> where T:IUser
        {
            T Creator { set;  }
        }
        public interface IHasCreator2<out T> where T:IUser
        {
            T Creator { get; } 
        }

        public class Foo : IHasCreator1<User>, IHasCreator2<User>
        {
            public User Creator { get; set; }
        }



А что показывает этот пример?
Имхо, только то, что проперти - это синтаксический сахар, о чем уже говорили в этом топике.
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38966001
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиезЕвгенийВРаз уж заговорили про ко/конрвариантность, значить созрели.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   public interface IUser
        { }

        public class User : IUser { }
        public interface IHasCreator1<in T> where T:IUser
        {
            T Creator { set;  }
        }
        public interface IHasCreator2<out T> where T:IUser
        {
            T Creator { get; } 
        }

        public class Foo : IHasCreator1<User>, IHasCreator2<User>
        {
            public User Creator { get; set; }
        }



А что показывает этот пример?Показывает то, что есть модификаторы in (контрвариантность) и out (ковариантность) :)
Если ищете некий сакральный смысл, то это к автору примера :)
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38966006
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA Covariance and Contravariance (C# and Visual Basic)

Ну, вариантность в дженериках и делегатах (aka функциональные типы) - это фича заявлена изначально, и вопросов там нет - работает как и везде :)
А тут вопрос жизни и смерти про ковариантность возвращаемых значений, которая не сильно нужна, как выясняется
...
Рейтинг: 0 / 0
Комбинирование интерфейсов
    #38966020
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез...вопрос жизни и смерти...
Диез...не сильно нужна...вопрос исчерпан :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Комбинирование интерфейсов
    #40009059
betelgeizex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бугага!

Прошло пять лет (всего-то), и до проектировщиков C# наконец-то дошло, что return-типы ковариантны по своей сути:

https://daveabrock.com/2020/07/14/c-sharp-9-target-typing-covariants

"It has been a long time, coming—almost two decades of begging and pleading, actually. With C# 9, it looks like return type covariance is finally coming to the language"

Что ты на это скажешь, Илон Маск ?
...
Рейтинг: 0 / 0
65 сообщений из 65, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Комбинирование интерфейсов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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