C#中的virtual和override的用法
有这样的片段:publicclassEllipse:Shape{protectedintsemiMajorAxis/*长半轴*/,semiMinorAxis/*短半轴*/...
有这样的片段:
public class Ellipse : Shape
{
protected int semiMajorAxis/*长半轴*/, semiMinorAxis/*短半轴*/;
public virtual int SemiMajorAxis
{
get
{
return semiMajorAxis;
}
set
{
semiMajorAxis = value;
}
}
public virtual int SemiMinorAxis
{
get
{
return semiMinorAxis;
}
set
{
semiMinorAxis = value;
}
}
public override double Area //椭圆面积公式:S = pi*a*b
{
get
{
return Math.PI * iMajorAxis * SemiMinorAxis;
}
}
这里面有virtual和override,是什么意思?为什么要用在这儿?书上的我看不太懂,请讲解一下,谢了。 展开
public class Ellipse : Shape
{
protected int semiMajorAxis/*长半轴*/, semiMinorAxis/*短半轴*/;
public virtual int SemiMajorAxis
{
get
{
return semiMajorAxis;
}
set
{
semiMajorAxis = value;
}
}
public virtual int SemiMinorAxis
{
get
{
return semiMinorAxis;
}
set
{
semiMinorAxis = value;
}
}
public override double Area //椭圆面积公式:S = pi*a*b
{
get
{
return Math.PI * iMajorAxis * SemiMinorAxis;
}
}
这里面有virtual和override,是什么意思?为什么要用在这儿?书上的我看不太懂,请讲解一下,谢了。 展开
2个回答
展开全部
overrride表示重写 这个类是继承于Shape类
<br>public override double Area 这个属性再shape中肯定存在 但是这里我们不想用shape中的 所以要重写
virtual是告诉其它想继承于他的类 你可以重写我的这个方法或属性,否则不允许。
给你一个生动的例子 老爸表示基类(被继承的类) 儿子表示子类(继承的类)
老爸用virtual告诉儿子:"孩子,你要继承我的事业,在这块上面可以自己继续发展你自己的"
儿子用override告诉全世界:"这个我可不是直接拿我爸的,他只是指个路给我,是我自己奋斗出来的"
<br>public override double Area 这个属性再shape中肯定存在 但是这里我们不想用shape中的 所以要重写
virtual是告诉其它想继承于他的类 你可以重写我的这个方法或属性,否则不允许。
给你一个生动的例子 老爸表示基类(被继承的类) 儿子表示子类(继承的类)
老爸用virtual告诉儿子:"孩子,你要继承我的事业,在这块上面可以自己继续发展你自己的"
儿子用override告诉全世界:"这个我可不是直接拿我爸的,他只是指个路给我,是我自己奋斗出来的"
展开全部
子类函数覆盖父类函数的方法总结:
(1)不使用任何修饰符
在不使用任何修饰符的情况下,可以实现覆盖,但是会有警告。
(2)使用new
new用在子类重写父类的函数前,此时覆盖可以正常完成,但是具体调用父类的函数还是调用子类的函数,要看对象的类型。示例程序如下:
namespace demo
{
class Person
{
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
public void show()
{
Console.WriteLine("姓名:{0},年龄:{1}", name, age);
} static void Main(string[] args)
{
Person per = new Person("张三丰", 24);
per.show();
//Person stu = new Student();//此时调用父类中的show方法
//Student stu = new Student();//此时调用子类中的show方法
stu.Department = "计算机";
stu.show();
}
}
class Student:Person
{
string department;
public string Department
{
set
{
department = value;
}
get
{
return department;
}
}
public new void show()
{
Console.WriteLine("系别:" + department);
}
}
}
(3)使用virtual,new或override
virtual用在父类的要被重写的函数前,new或override用在子类的重写父类的函数前。示例程序如下:
namespace demo
{
class Person
{
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
public virtual void show()
{
Console.WriteLine("姓名:{0},年龄:{1}", name, age);
} static void Main(string[] args)
{
Person per = new Person("张三丰", 24);
per.show();
//Person stu = new Student();//此时调用子类中的show方法
//Student stu = new Student();//此时调用子类中的show方法
stu.Department = "计算机";
stu.show();
}
}
class Student:Person
{
string department;
public string Department
{
set
{
department = value;
}
get
{
return department;
}
}
public new void show() //new也可以是用virtual。new时,调用父类show();override时,调用子类show()
{
Console.WriteLine("系别:" + department);
}
}
(4)总结如下
virtual函数允许子类函数重写该函数,override无论子类的实例是父类类型还是子类类型,子类的实例都会调用子类中重写的函数。new子类实例是子类类型,则调用子类中的重写函数;子类实例是父类类型,则调用父类中的重写函数。
父类中没有virtual修饰的函数也可以被子类中的new函数重写,但是此时子类的实例若是父类类型,调用的函数是父类的函数
(1)不使用任何修饰符
在不使用任何修饰符的情况下,可以实现覆盖,但是会有警告。
(2)使用new
new用在子类重写父类的函数前,此时覆盖可以正常完成,但是具体调用父类的函数还是调用子类的函数,要看对象的类型。示例程序如下:
namespace demo
{
class Person
{
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
public void show()
{
Console.WriteLine("姓名:{0},年龄:{1}", name, age);
} static void Main(string[] args)
{
Person per = new Person("张三丰", 24);
per.show();
//Person stu = new Student();//此时调用父类中的show方法
//Student stu = new Student();//此时调用子类中的show方法
stu.Department = "计算机";
stu.show();
}
}
class Student:Person
{
string department;
public string Department
{
set
{
department = value;
}
get
{
return department;
}
}
public new void show()
{
Console.WriteLine("系别:" + department);
}
}
}
(3)使用virtual,new或override
virtual用在父类的要被重写的函数前,new或override用在子类的重写父类的函数前。示例程序如下:
namespace demo
{
class Person
{
private string name;
private int age;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
}
public virtual void show()
{
Console.WriteLine("姓名:{0},年龄:{1}", name, age);
} static void Main(string[] args)
{
Person per = new Person("张三丰", 24);
per.show();
//Person stu = new Student();//此时调用子类中的show方法
//Student stu = new Student();//此时调用子类中的show方法
stu.Department = "计算机";
stu.show();
}
}
class Student:Person
{
string department;
public string Department
{
set
{
department = value;
}
get
{
return department;
}
}
public new void show() //new也可以是用virtual。new时,调用父类show();override时,调用子类show()
{
Console.WriteLine("系别:" + department);
}
}
(4)总结如下
virtual函数允许子类函数重写该函数,override无论子类的实例是父类类型还是子类类型,子类的实例都会调用子类中重写的函数。new子类实例是子类类型,则调用子类中的重写函数;子类实例是父类类型,则调用父类中的重写函数。
父类中没有virtual修饰的函数也可以被子类中的new函数重写,但是此时子类的实例若是父类类型,调用的函数是父类的函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询