调用inherit和基方法

本文关键字:方法 inherit 调用 | 更新日期: 2023-09-27 18:12:57

我有两个类

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }
    public void GetName()
    {
        Console.Write(Name);
    }
}
public class B : A
{
    public B(string N) : base(N)
    {
    }
    public new void GetName()
    {
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

我创建了一个新对象B,我想从A调用GetName,从B 调用GetName

B foo = new B("foo");
foo.GetName(); //  output "oof"

预期输出"foooof"

我已经尝试过public new void GetName() : base,但它不能编译

调用inherit和基方法

要获得所需的输出,需要调用Class BGetName()方法中的base GetName()方法。例如:

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }
    public void GetName()
    {
        Console.Write(Name);
    }
}
public class B : A
{
    public B(string N) : base(N)
    {
    }
    public new void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

这将输出foooof

使用重写并从重写的方法中调用基类的方法:

public class A
{
    public virtual void GetName()
    {
        Console.Write(Name);
    }
}
public class B : A
{
    public override void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

virtual关键字用于修改方法并允许在派生类中重写该方法,而new修饰符隐藏基类方法。通过调用base.GetName();,您正在执行基本方法BTW,这就是为什么在这里使用newoverride关键字没有区别,尽管我建议使用override

参考文献:

虚拟(C#参考(

知道何时使用覆盖和新关键字

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }
    public virtual void GetName()
    {
        Console.Write(Name);
    }
}
public class B : A
{
    public B(string N) : base(N)
    {
    }
    public override void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

根据您的选择使用override或new。喜欢处理这些场景。

            A foo = new B("foo");
            foo.GetName();

            A foo = new A("foo");
            foo.GetName();

            B foo = new B("foo");
            foo.GetName();

这个msdn链接会给你清晰的画面。