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


В чем ошибка?
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 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; }
    }

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

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

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

Похожие вопросы