ключевого слова виртуальных/переопределить только увидеть эту программуЧто касается C# OOPS использования
class A
{
public void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public void Foo() { Console.WriteLine("B::Foo()"); }
}
class Test
{
static void Main(string[] args)
{
A a;
B b;
a = new A();
b = new B();
a.Foo(); // output --> "A::Foo()"
b.Foo(); // output --> "B::Foo()"
a = new B();
a.Foo(); // output --> "A::Foo()"
}
}
1) как класс может иметь функцию, имеющую такие же имя. класс A имеет функцию foo(), а класс b имеет функцию foo(), когда класс b влечет A., когда класс b продляет a, то по классу наследования b получает функцию foo(). почему приведенный выше код работает без ошибок?
2)
a = new B();
a.Foo(); // output --> "A::Foo()"
, что значение а = новый B()?
Мы создаем экземпляр B, если да, тогда, когда мы пишем a.Foo(), тогда функция foo() класса b должна вызывать, но функция foo() класса a вызывается почему ??
При добавлении ключевого слова virtual/override функция foo() класса b вызывается.
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public override void Foo() { Console.WriteLine("B::Foo()"); }
}
class Test
{
static void Main(string[] args)
{
A a;
B b;
a = new A();
b = new B();
a.Foo(); // output --> "A::Foo()"
b.Foo(); // output --> "B::Foo()"
a = new B();
a.Foo(); // output --> "B::Foo()"
}
}
поэтому, пожалуйста, объясните, что происходит за сценой. спасибо
, мы можем напрямую создать экземпляр b и вызвать foo(), но почему люди пишут такой код A a = new B(), а затем вызывают a.foo()? какая цель может быть достигнута при написании такого кода. спасибо – Thomas
@Thomas см. мой обновленный ответ. – dcastro