Когда вы вызываете x.Next()
, он возвращает экземпляр чего-то, что реализует IA
.Это может быть A
, B
или любой другой класс, который реализует IA
, но поскольку он возвращает IA
, другие классы не знают, что такое конкретный тип.Это обычно преднамеренно.Если другие классы не знают, что такое реализация IA
, тогда вы можете заменить один другим.
Однако, поскольку Next
возвращает IA
, единственный способ вызвать PrintB
если IA
имеет метод PrintB
, например:
public interface IA
{
void PrintB();
}
Если A
реализует IA
, то он должен иметь метод PrintB
.Но поскольку это класс abstract
, метод может быть абстрактным.Это означает, что A
на самом деле не реализует метод.Для его реализации потребуется неабстрактный класс, который наследуется от A
.
Это выглядело бы так:
abstract class A : IA
{
public IA Next()
{
return this;
}
virtual public void Print()
{
Console.WriteLine("this is A");
}
public abstract void PrintB();
}
PrintB
не должно быть абстрактным.A
мог бы это реализовать.Это могут быть виртуальные и другие классы могут переопределить его.Или это может быть ни абстрактно, ни виртуально, и другие классы не могут переопределить его.
Теперь, когда вы объявляете B : A
, компилятору потребуется B
для реализации PrintB
.
Затем вы можете вызвать Next().PrintB()
, потому что Next()
возвращает IA
, а IA
имеет метод PrintB
.