abstract、virtual、override、new
2010-11-01 16:31
218 查看
关于这几个关键词,很多人的理解可能是字面上的含义:抽象、虚方法、覆盖、和新建。但是仔细的研究一下,发现并不仅仅是这些。下面就对这几个词作一些进一步的解释:
abstract:抽象,用于对类、方法、属性的定义,表示是一个抽象的类、抽象的方法或者是一个抽象的属性。对于抽象的类,不能被实例化;抽象方法只能有方法声明,不能有实现;属性也一样,只能有声明而不能有实现。抽象方法和抽象属性只能在抽象类中,但是抽象类可以包含非抽象的方法和属性。
virtual:虚拟的方法或属性。可以有相应的实现。在子类继承中,可以使用override重写该方法,这样父类在实例化时会调用子类的方法;如果子类使用new 重写该方法,则相当于是对该方法的“隐藏”,父类实例化为该子类时,调用的依然是父类的方法。
override:重载,使用该关键词时,父类实例化为该子类时,调用的是子类的方法。
new: “新建”,该关键词会隐藏父类的方法,从而使父类实例化为该子类时,调用的是父类的方法,而非子类的方法。
例:
// IAnimal接口
public interface IAnimal
{
string Name
{
get;
set;
}
void Run();
}
// Sheep abstract class
public abstract class Sheep:IAnimal
{
private string color;
public virtual string Color
{
get { return this.color; }
set { this.color = value; }
}
private string name;
public string Name
{
get { return this.name; }
set { this.name = value; }
}
public virtual void Run()
{
System.Console.Write("羊的抽象类");
}
public virtual void Call()
{
System.Console.Write("羊的叫声");
}
public abstract void Eat();
public void Sleep()
{
System.Console.Write("羊的睡觉");
}
}
//WhiteSheep class
public class WhiteSheep:Sheep
{
private string color;
public override string Color
{
get
{
return this.color;
}
set
{
this.color = value;
}
}
public override void Eat()
{
System.Console.Write("白羊吃草");
}
public new void Run()
{
System.Console.Write("白羊");
}
public override void Call()
{
System.Console.Write("白羊的叫声");
}
public new void Sleep()
{
System.Console.Write("白羊的睡觉");
}
}
WhiteSheep sheep = new WhiteSheep();
sheep.Call();//System.Console.Write("白羊的叫声");
sheep.Eat();/System.Console.Write("白羊吃草");
sheep.Run();//System.Console.Write("白羊");
sheep.Sleep();//System.Console.Write("白羊的睡觉");
Sheep sheep1 = new WhiteSheep();
sheep1.Call();//System.Console.Write("白羊的叫声");
sheep1.Eat();//System.Console.Write("白羊吃草");
sheep1.Run();//System.Console.Write("羊的抽象类");
sheep1.Sleep();//System.Console.Write("羊的睡觉");
abstract:抽象,用于对类、方法、属性的定义,表示是一个抽象的类、抽象的方法或者是一个抽象的属性。对于抽象的类,不能被实例化;抽象方法只能有方法声明,不能有实现;属性也一样,只能有声明而不能有实现。抽象方法和抽象属性只能在抽象类中,但是抽象类可以包含非抽象的方法和属性。
virtual:虚拟的方法或属性。可以有相应的实现。在子类继承中,可以使用override重写该方法,这样父类在实例化时会调用子类的方法;如果子类使用new 重写该方法,则相当于是对该方法的“隐藏”,父类实例化为该子类时,调用的依然是父类的方法。
override:重载,使用该关键词时,父类实例化为该子类时,调用的是子类的方法。
new: “新建”,该关键词会隐藏父类的方法,从而使父类实例化为该子类时,调用的是父类的方法,而非子类的方法。
例:
// IAnimal接口
public interface IAnimal
{
string Name
{
get;
set;
}
void Run();
}
// Sheep abstract class
public abstract class Sheep:IAnimal
{
private string color;
public virtual string Color
{
get { return this.color; }
set { this.color = value; }
}
private string name;
public string Name
{
get { return this.name; }
set { this.name = value; }
}
public virtual void Run()
{
System.Console.Write("羊的抽象类");
}
public virtual void Call()
{
System.Console.Write("羊的叫声");
}
public abstract void Eat();
public void Sleep()
{
System.Console.Write("羊的睡觉");
}
}
//WhiteSheep class
public class WhiteSheep:Sheep
{
private string color;
public override string Color
{
get
{
return this.color;
}
set
{
this.color = value;
}
}
public override void Eat()
{
System.Console.Write("白羊吃草");
}
public new void Run()
{
System.Console.Write("白羊");
}
public override void Call()
{
System.Console.Write("白羊的叫声");
}
public new void Sleep()
{
System.Console.Write("白羊的睡觉");
}
}
WhiteSheep sheep = new WhiteSheep();
sheep.Call();//System.Console.Write("白羊的叫声");
sheep.Eat();/System.Console.Write("白羊吃草");
sheep.Run();//System.Console.Write("白羊");
sheep.Sleep();//System.Console.Write("白羊的睡觉");
Sheep sheep1 = new WhiteSheep();
sheep1.Call();//System.Console.Write("白羊的叫声");
sheep1.Eat();//System.Console.Write("白羊吃草");
sheep1.Run();//System.Console.Write("羊的抽象类");
sheep1.Sleep();//System.Console.Write("羊的睡觉");
相关文章推荐
- sealed,new,virtual,abstract与override
- new、abstract、virtual、override,sealed关键字区别和使用代码示例
- C#.NET中new, override, virtual abstract关键字的区别
- C#.NET学习笔记---C#中方法覆盖时override和new的比较,abstract和virtual的比较(含C#多态的实现)
- c#中的interface abstract virtual override和new
- C# Keywords Series 8 interface&virtual&abstract&override&new
- abstract、override、new、virtual、sealed使用和示例
- c#中的interface abstract virtual override和new
- C#继承之base,virtual,override,abstract,new,sealed关键字
- net这种有对这些知识讲解sealed、new、virtual、abstract 和 override
- new与override的差异以及virtual方法与abstract方法的区别
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
- sealed、new、virtual、abstract与override 趣解
- c#中abstract、override、new、virtual、sealed使用和示例
- abstract、virtual、override 和 new
- new、abstract、virtual、override,sealed关键字区别和使用代码示例
- sealed、new、virtual、abstract与override 总结
- sealed、new、virtual、abstract与override 总结
- new virtual abstract sealed override
- Modifiers: virtual, override, new, abstract, sealed, internal