C# 重写/新方法

C# 重写/新方法,c#,inheritance,polymorphism,virtual-functions,C#,Inheritance,Polymorphism,Virtual Functions,我不熟悉C#(来自C++) > P> >我可以声明一个方法是“代码>虚拟< /COD>”和“代码>覆盖< ?(C++中,该方法也可以是虚拟的,在基础和派生类中) 我的教科书中关于newmethod关键字的解释是: 有时,您可能希望创建一个存在于基类中的方法的自己的实现。Line类通过声明其 自己的print()方法。Line print()方法隐藏DrawingObject print()方法。其效果是父print()方法将不会 调用,除非我们做了一些特殊的事情来确保它被调用。 请注意Line

我不熟悉C#(来自C++)

<> > P> >我可以声明一个方法是“代码>虚拟< /COD>”和“代码>覆盖< <代码>?(C++中,该方法也可以是虚拟的,在基础和派生类中)

  • 我的教科书中关于
    new
    method关键字的解释是:

  • 有时,您可能希望创建一个存在于基类中的方法的自己的实现。Line类通过声明其 自己的print()方法。Line print()方法隐藏DrawingObject print()方法。其效果是父print()方法将不会 调用,除非我们做了一些特殊的事情来确保它被调用。 请注意Line类print()方法上的新修饰符。这使得 此方法用于隐藏DrawingObject类print()方法和 明确说明您不想这样做的意图 发生。如果没有新的修饰符,编译器将产生警告 请注意这一点

    它的影响是什么

  • 基类方法是虚拟的,派生的新方法是
  • 基类方法不是虚拟的,派生方法是新的
  • 如果在派生类中不对方法使用new关键字,会发生什么
  • 如果方法在基类中不是虚拟的,那么多态性是如何发生的
  • 为什么“如果没有新的修饰符,编译器将产生警告”
  • 这些问题涉及以下代码

    using System;
    
    public class DrawingObject
    {
        public virtual void Draw()
        {
            Console.WriteLine("I'm just a generic drawing object.");
        }
        public void print()
        {
            Console.WriteLine("I'm a Parent Class.");
        }
    }
    public class Line : DrawingObject
    {
        public override void Draw()
        {
            Console.WriteLine("I'm a Line.");
        }
        public new void print()
        {
            base.print();
            Console.WriteLine("I'm a Child Class.");
        }
    }
    
    public class Circle : DrawingObject
    {
        public override void Draw()
        {
            Console.WriteLine("I'm a Circle.");
        }
    }
    
    public class Square : DrawingObject
    {
        public override void Draw()
        {
            Console.WriteLine("I'm a Square.");
        }
    }
    

    是的,您可以使用
    virtual
    关键字标记方法,然后在派生类中使用
    override
    重写它

  • 如果您有派生类型的变量-将调用新方法。若您有基类类型的变量(但其中确实包含派生类型),则将调用基类中的虚拟方法
  • 同样的
  • 如果用override标记它,将得到经典多态性
  • 方法应该是虚拟it基类以使用多态性
  • 如果您偶然无意中创建了一个隐藏基类版本的新方法,则这是一个警告。您应该使用
    new
    来明确您的意图,并确保这不是一个错误

  • 是的,您可以使用
    virtual
    关键字标记方法,然后在派生类中使用
    override
    重写它

  • 如果您有派生类型的变量-将调用新方法。若您有基类类型的变量(但其中确实包含派生类型),则将调用基类中的虚拟方法
  • 同样的
  • 如果用override标记它,将得到经典多态性
  • 方法应该是虚拟it基类以使用多态性
  • 如果您偶然无意中创建了一个隐藏基类版本的新方法,则这是一个警告。您应该使用
    new
    来明确您的意图,并确保这不是一个错误

  • 是的,您可以使用
    virtual
    关键字标记方法,然后在派生类中使用
    override
    重写它

  • 如果您有派生类型的变量-将调用新方法。若您有基类类型的变量(但其中确实包含派生类型),则将调用基类中的虚拟方法
  • 同样的
  • 如果用override标记它,将得到经典多态性
  • 方法应该是虚拟it基类以使用多态性
  • 如果您偶然无意中创建了一个隐藏基类版本的新方法,则这是一个警告。您应该使用
    new
    来明确您的意图,并确保这不是一个错误

  • 是的,您可以使用
    virtual
    关键字标记方法,然后在派生类中使用
    override
    重写它

  • 如果您有派生类型的变量-将调用新方法。若您有基类类型的变量(但其中确实包含派生类型),则将调用基类中的虚拟方法
  • 同样的
  • 如果用override标记它,将得到经典多态性
  • 方法应该是虚拟it基类以使用多态性
  • 如果您偶然无意中创建了一个隐藏基类版本的新方法,则这是一个警告。您应该使用
    new
    来明确您的意图,并确保这不是一个错误

  • 派生类中的
    new
    关键字称为“隐藏”基类的方法,本质上它隐藏了该方法的基类实现。如果省略
    new
    关键字,您将看到的警告消息是编译器告诉您应该明确声明您打算使用
    new
    语法隐藏/隐藏该方法。在语法中使用
    new
    关键字可以让任何阅读代码的人清楚地看到,您隐藏了一个基本实现


    注意:这只是一个警告,因为通过在派生类中实现非虚方法,您正在隐藏/隐藏基类的实现。编译器只是告诉您要做一个好公民,并通知正在阅读您代码的其他人


    派生类中的
    new
    关键字称为“隐藏”基类的方法,本质上它隐藏了该方法的基类实现。如果省略
    new
    关键字,您将看到的警告消息是编译器告诉您应该明确声明您打算使用
    new
    语法隐藏/隐藏该方法。在语法中使用
    new
    关键字可以让任何阅读代码的人清楚地看到,您隐藏了一个基本实现


    注意:这只是一个警告,因为通过在派生类中实现非虚方法,您正在隐藏/隐藏基类的实现。编译器只是告诉您要做一个好公民,并通知正在阅读您代码的其他人


    派生类中的
    new
    关键字被调用“
    public class Base
    {
        public void Method()
        {
            Console.WriteLine("Base.Method()");
        }
    }
    
    public class Derived : Base
    {
        public new void Method()
        {
            Console.WriteLine("Derived.Method()");
        }
    }
    
    Derived obj = new Derived();
    obj.Method(); // Will output "Derived.Method()"
    ((Base)obj).Method() // Will output "Base.Method()"