刚接触C#,学完了三大特性之中的继承,回头想想,把自己遇到的问题和学习过程中遇到的注意点拿出来和大家探讨一下,互相学习!
在C#中,继承可以分为两种:第一、接口继承。第二、类继承。这里我们主要说一下类的继承!
继承通俗点说,就是子类从父类中继承所有的成员,但构造函数(无论是静态构造函数、析构函数,非静态构造函数)、private修 饰符的成员、事件除外哦!这样提高了代码的重用性。也可以这样说:继承就是子类使用父类中的成员。
类继承的注意点:
1、C#中只允许单继承,所有的派生类(子类)只能有一个父类
2、C#中继承是可以传递的,即,C类继承B类,B类又继承A类,那么C类也继承A类的成员
3、子类可以覆盖父类中的【同名成员】,覆盖后,在子类中不能直接访问父类中的该成员,可以使用“base.基类方法名”访 问。writeline函数
4、父类的访问修饰符,权限不能低于子类的访问修饰符,否则编译不通过。
类继承的子类父类的构造函数的执行顺序:
(这是解题思路,我是这样认为的,初学者老是忽略掉,以后只要看到继承,就应该想起这执行顺序)
1、先执行父类中的构造函数,再执行子类的构造函数(所有类都是继承Object,其实是先执行Object,在执行父类-->子类)
注:当类中出现了构造函数的时候就调用该构造函数,如果没有,系统就调用默认的构造函数。
继承中的Base的用法:
学过的都知道,构造函数是用来初始化类的,来完成对实例化对象的初始化操作。
1、Base是用在派生类中,实现对基类公有或者受保护(protected)的成员访问
2、Base是指父类哦!
3、public Son():Base.Father()
{
Console.WriteLine("");
}
当实例化子类Son的时候,就首先执行其父类Father()的构造函数
继承中的New的用法:
1、当子类继承了父类,如果父类有些成员无法满足子类的需要,若想更改基类的数据行为,有以下两种选择
1)使用新的派生类成员代替基成员
2)重写虚拟的基成员
2、new关键字放在返回值类型前面
如果在子类和父类中出现同名的成员时,编译的时候能通过,但会出现一个警告:“警告1隐藏了继承的成。如果是有意隐藏 ,请使用关键字 new。”
理解如下代码就可以完全掌握New的用法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace InheritanceTest
{
internal class Program
{
static void Main(str
ing[] args)
{
Man m = new Man();
m.sum();
person p=(person)m;//把子类强制转化成父类person类型
p.sum();
Console.ReadKey();
}
}
public class person
{
public void sum()
{
Console.WriteLine("父类、、");
}
}
public class Man : person
{
public new void sum()
{
Console.WriteLine("子类、、");
}
}
}
其结果:子类
父类
说明:使用new关键字,隐藏了基类的同名成员(不是重写或覆盖哦!这点和virtual不一样,注意区别两者异同)。说明在实例化子类,子类调用的是子类中使用new的成员,而把子类强制转化成父类类型的话,那调用的就是父类的同名成员。
这些和virtual不同,请注意区别!!!
继承中virtual的用法:
1、virtual修饰符不能与static、abstract、private,override等修饰符一起使用
2、如果要想在子类中完全代替父类中的成员,就把父类的成员声明为virtual
如下例子:
namespace InheritanceTest
{
internal class Program
{
static void Main(string[] args)
{
Man m = new Man();
m.sum();
person p=(person)m;
p.sum();
Console.ReadKey();
}
}
public class person
{
public virtual void sum()
{
Console.WriteLine("父类、、");
}
}
public class Man : person
{
public void sum()
{
Console.WriteLine("子类、、");
}
}
}
结果为:子类
父类
这没有什么要说明的。把该代码产生的结果和以下的代码产生的结果对比一下,
我修改了上面的代码,添加了关键字,override,就产生了不同的效果
public class Man : person
{
public override void sum()
{
Console.WriteLine("子类、、");
}
}
结果:子类
子类
通过比较可以知道:在Main入口函数中,把m强制转化成person类型,原本应当调用person类中的sum(),但系统检测到父类中的sum()被子类使用override重写,所有就调用了子类中的sum()
继承中override方法的使用
1、在子类中把父类中的某些修饰符为abstract,virtual,override进行重写(不能重写非虚方法或者静态方法)
2、重写的时候,方法签名必须一样
3、当子类中有override的方法,将不调用基类中的方法,将调用该方法。
4、不能更改virtual方法的可访问性,访问修饰符要相同
5、不能用new,abstract,virtual,static 来修饰override
总结:继承中的三个关键字 new virtual override
new:隐藏基类成员
(虽然隐藏但还是存在的),强制转化子类类型为父类类型时,仍然调用的是父类的方法,
virtual:虚方法,如果要完全控制,必须在子类中使用override重写,但也可以不用重写(这点不想abstract,必须在子类中重写),
强制转化子类类型为父类类型时,但调用的时候,如果该基类方法被子类用override重写了,就调用子类方法,否则仍然调 用基类方法。
override:重写方法,重写的时候将覆盖被重写的所有方法。
以上就是C#继承中,简单的语法吧,有不周到的地方请大哥大,小弟小妹们指点一下,共同进步!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论