c#_虚基类[virtual],基类与⼦类继承及引⽤关系
可以在类中定义字段和⽅法,字段为私有,可通过构造⽅法(写在基类中)控制字段的改变。
⽅法为私有。
⽗类中含有构造⽅法,⼦类中也需要写构造⽅法,⽤于对⽗类构造⽅法的调⽤,其中参数名(⽗类中定义的字段名),参数类型也需要⼀致。
类的赋值:
1.⽗类可以引⽤⼦类对象。
2.⽗类引⽤只能调⽤⼦类继承⽗类的⽅法,⽗类引⽤不能调⽤⼦类独有的⽅法。
parent newchild = new children1("c11");
newchild.father();
Console.WriteLine("newchild 的名字为:"+ame());
3.⼦类引⽤不能直接赋值⽗类对象,即使将⽗类对象进⾏强制转换,也不可以。(编译虽通过,但运⾏异常)。
定义新类:重定义⽗类中的⽅法(并不改变⽗类中⽅法体),使⽤关键字new,但是不使⽤关键字也可运⾏,⼀般不提倡。
//基类:
public void speak() {
Console.WriteLine("This is parent talking");
}
//⼦类:
new public void speak(){
Console.WriteLine("This is children1 talking");
}
虚基类⽅法的重写:
//⽗类:
public virtual void father() {
Console.WriteLine(name+" "+"is my father");
}
//⼦类:
public override void father(){
Console.WriteLine("Now I'm father");
}
总结:
new是在⼦类中隐藏⽗类中同名⽅法(适⽤于⼦类引⽤⾃⼰的对象)。
override是⼦类重写⽗类⽅法,但不会真正的改变基类的⽅法(适⽤于⽗类可以引⽤⼦类对象(已⽤override声明重写⽅法)的情况,如parent newchild = new children1("c11");及⼦类(已⽤override声明重写⽅法)引⽤⾃⼰的对象的情况)。
定义override⽅法的注意事项:
1.必须是virtual修饰的⽅法。
2.要重写的是⽗类中⼦类能访问的⽅法,即public类型 。
多态:
⼀个⽅法在不同类中可以有不同的⽅法体
演⽰内容:
//基类:
private string name;
public parent(string aname)
{
name = aname;
}
public void speak()
{
Console.WriteLine("This is parent talking");
}
public string getname()
{
return name;
}
public void father() {
Console.WriteLine(name+" "+"is my father");
}
public void mother()
{
Console.WriteLine(name + " " + "is my mother");
}
//⼦类1:
class children1:parent
{
public children1(string name) : base(name) {
}
new public void speak()
{
Console.WriteLine("This is children1 talking");
}
public void childone() {
Console.WriteLine(getname()+" "+"is children1's move"); }
}
//⼦类2:
class children2:parent
{
public children2(string name) : base(name) {
}
public void childtwo()
{
Console.WriteLine(getname()+" "+ "is children2's move"); }
}
//主程序:
static void Main(string[] args)
{
parent p = new parent("p");
writeline方法属于类p.father();
p.speak();
children1 c1 = new children1("c1");
c1.father();
c1.childone();
c1.speak();
children2 c2 = new children2("c2");
c2.father();
c2.childtwo();
/
/类的赋值(⽗类引⽤可以直接赋值⼦类对象)
//类的赋值(⽗类引⽤可以直接赋值⼦类对象)
parent newchild = new children1("c11");
newchild.father();
Console.WriteLine("newchild 的名字为:"+ame()); //以下⽅法错误(⼦类引⽤不能直接赋值⽗类对象):
//children1 c1child = (children1)new parent("c111");
//c1child.father();
//her();
//c1child.childone();
Console.ReadKey();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论