BLOG zzy.my

合抱之木, 生于毫末; 九层之台, 起于累土; 千里之行, 始于足下。

C# 重写(override) 和 覆盖(new)

virtual 用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。

例如,此方法可被任何继承它的类重写。虚拟成员的实现可由派生类中的 重写成员更改。

有关使用 virtual 的更多信息,参考微软 使用 Override 和 New 关键字进行版本控制

用关键字 virtual 修饰的方法,叫虚方法。在子类中用override 声明同名的方法,这叫“重写”。相应的没有用virtual修饰的方法,可以叫实方法

 

默认情况下,C# 方法为非虚方法。 如果某个方法被声明为虚方法,则继承该方法的任何类都可以实现它自己的版本。 若要使方法成为虚方法,必须在基类的方法声明中使用 virtual 修饰符。 然后,派生类可以使用 override 关键字重写基虚方法,或使用 new 关键字隐藏基类中的虚方法。 如果 override 关键字和 new 关键字均未指定,编译器将发出警告,并且派生类中的方法将隐藏基类中的方法。

 

public class ParentClass
{
    public virtual int Number()
    {
        return 100;
    }
}

public class ChildClass : ParentClass
{
    public override string Number()
    {
        return 200;
    }
}

ParentClass output = new ParentClass();
//output.Number() 等于 100

ChildClass output = new ChildClass();
//output.Number() 等于 200

ParentClass output = new ChildClass();
//output.Number() 等于 200

 

在子类中用 new 关键字修饰 定义的与父类中同名的方法,叫覆盖。
覆盖不会改变父类方法的功能。

public class ParentClass
{
    public string Number()
    {
        return 100;
    }
}

public class ChildClass : C1
{
    public new string Number()
    {
        return 200;
    }
}

ParentClass output = new ParentClass();
//output.Number() 等于 100

ChildClass output = new ChildClass();
//output.Number() 等于 200

ParentClass output = new ChildClass();
//output.Number() 等于 100

 

 

Loading