powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Комбинирование интерфейсов
25 сообщений из 65, страница 1 из 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
25 сообщений из 65, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Комбинирование интерфейсов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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