c # Создание объекта из подкласса - PullRequest
0 голосов
/ 03 июня 2019

Ниже у меня есть простой код с родительским классом и дочерним классом, который вытекает из него.

using System;

//Base Class
public class Parent {
    public void foo() {
        Console.WriteLine("Parent");
    }
}

//Child Class
public class Child : Parent
{
    new public void foo() {
        Console.WriteLine("child");
    }
}

Parent parent = new Child();
parent.foo();

Я запутался в том, как две строкинад работой.Я бы ожидал, что компилятор лает, пытаясь создать экземпляр Parent как своего собственного подкласса.Кроме того, почему тогда parent.foo () по-прежнему вызывает родительскую версию.

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Сначала вы не должны скрывать метод базового класса, используя ключевое слово new, вы просто должны переопределить его методом производного класса, используя ключевые слова virtual и override.Это также исправит проблему с вызовом метода из базового класса, а не из производного.

Для получения подробной информации о том, как это работает, вы должны прочитать о наследовании в C # .

Когда вы скрываете метод с помощью ключевого слова new, он всегда использует реализацию метода, который находится вваш объявленный тип, в вашем случае это Parent.Но если вы используете virtual и override, это использует реализацию метода в инициализированном типе, в вашем случае это Child.

using System;

public class Parent 
{
    public virtual void foo() 
    {
        Console.WriteLine("Parent");
    }
}

public class Child : Parent
{
    public override void foo() 
    {
        Console.WriteLine("Child");
    }
}
0 голосов
/ 03 июня 2019

почему тогда parent.foo () по-прежнему вызывает родительскую версию?

Поскольку вы затеняете foo, используя new.

Виртуальные или абстрактные методы могут быть переопределены подклассами:

//Base Class
public class Parent
{
    public virtual void foo()
    {
        Console.WriteLine("Parent");
    }
}

//Child Class
public class Child : Parent
{
    public override void foo()
    {
        Console.WriteLine("child");
    }
}

Я бы прочитал всю документацию, связанную в комментариях, чтобы решить, какая из них лучше всего подойдет для вашего варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...