class Program
{
static void Main(string[] args)
{
BaseClass obj1 = new DerivedClass();
DerivedClass obj2 = new DerivedClass();
obj1.SayHello();
obj2.SayHello();
}
}
public class BaseClass
{
public virtual void SayHello()
{
Console.WriteLine("Base class : SayHello");
}
}
public class DerivedClass : BaseClass
{
public override void SayHello()
{
Console.WriteLine("Derived class: SayHello");
}
}
运行结果:
class Program
{
static void Main(string[] args)
{
BaseClass obj1 = new DerivedClass();
DerivedClass obj2 = new DerivedClass();
obj1.SayHello();
obj2.SayHello();
}
}
public class BaseClass
{
public virtual void SayHello()
{
Console.WriteLine("Base class : SayHello");
}
}
public class DerivedClass : BaseClass
{
public void SayHello()
{
Console.WriteLine("Derived class: SayHello");
}
}
这样的写法会有警告:'DerivedClass.SayHello()' 隐藏了继承的成员 'BaseClass.SayHello()'.为了使当前的成员重写父类的实现,请添加override关键字,否则请添加new关键字.运行结果:
class Program
{
static void Main(string[] args)
{
BaseClass obj1 = new DerivedClass();
DerivedClass obj2 = new DerivedClass();
obj1.SayHello();
obj2.SayHello();
}
}
public class BaseClass
{
public virtual void SayHello()
{
Console.WriteLine("Base class : SayHello");
}
}
public class DerivedClass : BaseClass
{
public new void SayHello()
{
Console.WriteLine("Derived class: SayHello");
}
}
这样就没有警告,运行的结果和没加new关键字一样。
---------------------------------------------------------------------------------分--------------------割------------------------线-------------------------------------------------------------------------------------------------
class Program
{
static void Main(string[] args)
{
BaseClass obj1 = new DerivedClass();
DerivedClass obj2 = new DerivedClass();
obj1.SayHello();
obj2.SayHello();
}
}
public class BaseClass
{
public void SayHello()
{
Console.WriteLine("Base class : SayHello");
}
}
public class DerivedClass : BaseClass
{
public override void SayHello()
{
Console.WriteLine("Derived class: SayHello");
}
}
编译直接出错: DerivedClass.SayHello()': 不能重写继承的 'BaseClass.SayHello()',因为它没有被标记为virtual, abstract或者override.
class Program
{
static void Main(string[] args)
{
BaseClass obj1 = new DerivedClass();
DerivedClass obj2 = new DerivedClass();
obj1.SayHello();
obj2.SayHello();
}
}
public class BaseClass
{
public void SayHello()
{
Console.WriteLine("Base class : SayHello");
}
}
public class DerivedClass : BaseClass
{
public void SayHello()
{
Console.WriteLine("Derived class: SayHello");
}
}
这样写会有警告:'DerivedClass.SayHello()' 隐藏了'BaseClass.SayHello()'. 如果是为了隐藏请使用new关键字. 运行结果:
class Program
{
static void Main(string[] args)
{
BaseClass obj1 = new DerivedClass();
DerivedClass obj2 = new DerivedClass();
obj1.SayHello();
obj2.SayHello();
}
}
public class BaseClass
{
public void SayHello()
{
Console.WriteLine("Base class : SayHello");
}
}
public class DerivedClass : BaseClass
{
public new void SayHello()
{
Console.WriteLine("Derived class: SayHello");
}
}
运行结果和没加new关键字一样.
总结一下virtual,override,new的使用方法: 如果父类想让它的方法能在子类中被重写,就必须加virtual关键字。然后在子类中,如果子类想重写父类的方法就必须在方法前添加override关键字,前提是父类已经把该方法声明为virtual,否则子类无法重写该方法. 如果子类不想重写,只是想隐藏父类的方法,那么就可以添加new关键字。虽然不加new关键字,最终的行为也和加new关键字一样,但是我们还是建议在方法前面添加new关键字。这样会让你一眼就知道该方法在父类中也有实现,只是被你隐藏了。
重写:在调用是总是使用在子类中的方法.
隐藏: 会根据你的实际声明的类型来调用方法。