Вы никогда не создавали объект B
или anotherClass
.Поэтому их Start
метод не может быть вызван.
Наследование работает наоборот.Производный класс может вызывать членов своего базового класса, потому что он знает своего предка и наследует все его члены (поля, свойства, методы).Базовый класс (A
) на другой стороне не знает своих потомков.
Вы должны использовать virtual
методы, которые вы можете override
в производных классах.Пример:
class A
{
public virtual void Start()
{
Console.WriteLine("Starting A");
}
}
class B : A
{
public override void Start()
{
base.Start();
Console.WriteLine("Starting B");
}
}
Теперь вы можете создать B
объект и вызвать его Start
метод
var b = new B();
b.Start();
Это выдаст:
Starting A
Starting B
Спроизводные типы совместимы по присваиванию с их базовыми типами, вы также можете сделать что-то вроде этого
var list = new List<A> { new B(), new A() };
foreach (A a in list) {
a.Start();
}
Starting A
Starting B
Starting A
, где две первые строки от B.Start()
и последняя от A.Start()
.
Но это работает только для классов в прямой линии.Вы не можете вызывать методы от братьев и сестер.Зачем?Давайте создадим пример:
class C : A
{
private string s = "hello";
public override void Start()
{
base.Start();
Console.WriteLine("Starting C: " + s);
}
}
Предполагая, что вы можете сделать что-то подобное в B
:
sibling(C).Start();
Откуда берется значение "hello"
из s
?Ни A
, ни B
не имеют такого поля, а объект C
никогда не создавался.Поэтому ваше требование вызывать каждый метод из всех классов не может быть выполнено.Но если бы было задействовано поле A
, это сработало бы, так как B
наследует это поле.