zergon321
@zergon321

Что не так с наследованием интерфейсов?

Изучаю наследование интерфейсов. При компиляции данного кода:

using System;
 
public class Test
{
	public static void Main()
	{
		Lol l = new Lol();
		Console.WriteLine(((IParent)l).Family);
		Console.WriteLine(((IChild)l).Family);
		Console.WriteLine(l.Name);
	}
}
 
public interface IParent
{
	string Family { get; }
}
 
public interface IChild : IParent
{
	string Name { get; }
}
 
public class Lol : IChild
{
	string IParent.Family { get { return "suck"; } }
	string IChild.Family { get { return "duck"; } }
	public string Name { get { return "ross"; } }
}


IdeOne выдает:

prog.cs(27,26): error CS0550: `Lol.IChild.Family.get' is an accessor not found in interface member `IChild.Family'
Compilation failed: 1 error(s), 0 warnings


В чем ошибка?
  • Вопрос задан
  • 192 просмотра
Пригласить эксперта
Ответы на вопрос 3
@Sumor
Вы не указали, что Lol реализует интерфейс IParent
public class Lol : IChild, IParent
А также, вероятно, вы хотели в IChild добавить свойство Family

После обновления кода:
Вы используете явную реализацию интерфейса, но у IChild нет собственного свойства Family, только наследуемое от IParent. Как раз можно изучить ключевое слово new у свойств.
Возможно то что вы хотите посмотреть делается так:
using System;


public class Test
{
	public static void Main()
	{
		Lol l = new Lol();
		Console.WriteLine(((IParent)l).Family);
		Console.WriteLine(((IChild)l).Family);
		Console.WriteLine(l.Name);
		Console.ReadLine ();
	}
}

public class IParent
{
	public string Family { get { return "suck"; } }
}

public class IChild : IParent
{
	public string Family { get { return "duck"; } }

}

public class Lol : IChild
{	
	public string Name { get { return "ross"; } }
}
// Вывод:
// suck
// duck
// ross
Ответ написан
Комментировать
@Got_Oxidus
Учусь
public class Lol : IChild,    IParent  // !!!
{
  string IParent.Family { get { return "suck"; } }
  string IChild.Family { get { return "duck"; } }
  public string Name { get { return "ross"; } }
}


Вы пытаетесь использовать свойство интерфейса не унаследовав его.

Советую выучить английский или как минимум научиться читать ошибки.
Ответ написан
@kvasek
Когда вы явно имплиментируте интерфейсы существует маленькое исключение, C# ожидает что вы укажете имена производного интерфейса, а не имена интерфейса, которые может наследовать от другого интерфейса.

В вашем случае IChild не содержит поле Family, поэтому вы и получаете ошибку 'accessor not found'.
Суть явной имплиментации интерфейса, заключается в явном использовании имен интерфейса, без учета базового интерфейса.

Вы можете сделать следующим образом.
public interface IChild : IParent
    {
        new string Family { get; }
        string Name { get; }
    }

Хотя навряд это то что вы ожидали услышать, но вот такие ограничения ((

Прошу прощения если запутал.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы