【问题标题】:Calling the inherit and the base method [duplicate]调用继承和基本方法[重复]
【发布时间】:2016-10-14 06:19:56
【问题描述】:

我有两节课

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,但编译失败

【问题讨论】:

    标签: c# class inheritance


    【解决方案1】:

    要获得所需的输出,您需要在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

    【讨论】:

      【解决方案2】:

      使用覆盖并从被覆盖的方法中调用基类的方法:

      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();,您正在执行基本方法顺便说一句,这就是为什么在这里使用newoverride 关键字没有区别,尽管我建议使用override

      参考资料:

      virtual (C# Reference)

      Knowing When to Use Override and New Keywords

      【讨论】:

      • base.GetName(); 似乎也可以在没有 override 的情况下工作
      • @GodofSource virtual 关键字用于修改方法并允许在派生类中覆盖它。所以你可以结合上面代码中提到的GetName的结果。
      • @GodofSource override 修饰符扩展了基类方法,new 修饰符隐藏了它。通过调用base.GetName();,您正在执行基本方法顺便说一句,这就是为什么在这里使用newoverride 没有区别。但是您应该知道,使用 new 隐藏了基本方法,但使用 override 扩展了它。
      • @GodofSource new 很危险。如果您不知道自己在做什么,请不要使用它。
      • 什么是“扩展”?
      【解决方案3】:
      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 link会给你清晰的画面。

      【讨论】:

        猜你喜欢
        • 2015-05-24
        • 1970-01-01
        • 2020-07-03
        • 1970-01-01
        • 2015-09-19
        • 1970-01-01
        • 2018-04-18
        • 2013-04-25
        • 1970-01-01
        相关资源
        最近更新 更多