前言:这节课是C#讲解的第四节课,主要围绕面向对象的三大特性展开。上节课已经把封装讲完了,这节课讲继承和多态。

内容

  1.继承:写程序的时候有些信息是公共的,可以将这些公共的信息写在父类里,增强代码的可复用性。

    (1)class A : B,被继承的类称为基类或父类或超类,而继承得到的类称为子类或派生类。子类继承超类的状态和行为(字段和方法),同时也可以具有自己的特征。父类里面的私有成员,子类也是继承了的,只是没有访问权限,就像不知道密码的保险箱一样。

    (2)A:B,B:C,则A:C。

    (3)任何类型的基类是object类型。

    (4)当一个类是密封类(sealed),它是不能被继承的。

    (5)A:B,B里面有sayHi(),用A的实例化对象调用sayHi()的时候,首先调用的是B里面的构造方法,然后是A的构造方法,最后才是sayHi(),如果B上面还有继承的类,则先调用该类的构造方法。如:

Animal类:

 class Animal
{
public Animal()
{
Console.WriteLine("我是动物,我出生了");
}
}

Person类:

 class Person:Animal
{
public int age;
public string name; public Person()
{
Console.WriteLine("我是人类,我出生了");
}
public void SayHi()
{
Console.WriteLine("大家好,我是人类");
}
}

Chinese类:

 class Chinese:Person
{
public Chinese()
{
Console.WriteLine("我是中国人,我出生了");
}
}

其中:Chinese:Person,Person:Animal。

 class Program
{
static void Main(string[] args)
{
Chinese c = new Chinese();
c.SayHi();
Console.ReadKey();
}
}

运行结果为:

    (6)如果子类和父类里有相同名称的方法,若子类对象调用该方法,则父类中的同名方法将被隐藏。可使用new修饰同名方法而达到隐藏父类同名方法的目的。

    (7)一个父类的方法如果要被子类覆写,则父类需声明为virtual类型。子类继承后使用override修饰该方法。如在父类中:public virtual void SayHi(),在子类中:public override void SayHi()。

    (8)里氏替换原则:子类对象可以赋值给父类对象:Person p = new Chinese(),反之不成立。

    (9)如果A:B,A、B里面都有一个方法叫SayHi(),B b = new A(),当b调用SayHi()时,默认情况下(即没有被复写),则采用就近原则,即调用 B的SayHi()。如果SayHi()被覆写,则调用子类的SayHi()。

  2.多态:同一种方法名,但是有不同的实现形式。多态分为重载(overload)和覆写(override)。

    (1)重载:方法名相同,方法里面的参数个数或者类型不同。

    (2)只有父类的虚方法(virtual)才能被子类覆写,子类覆写用关键字override。如果不加override就隐藏了父类的方法(需加关键字new)。

    (3)静态方法不能被覆写,但可以被隐藏。

    (4)静态类里面只能有静态成员。

    (5)静态成员不能带override,virtual,abstract。

  3.抽象类、抽象方法:abstract + 类名、abstract + 方法名

    (1)抽象类不能被实例化。

    (2)抽象方法的作用是为子类提供一个统一的接口,抽象方法里面只有声明,没有实现。

    (3)一个类一旦继承了一个抽象类,就必须实现对该抽象类里面所有的抽象方法的实现。

    (4)一个抽象类里面可以有非抽象方法,但是一旦一个类里面有抽象方法,该类就为抽象类了。

    (5)抽象方法在声明后用一个;结束,不需要用{}。

    (6)抽象方法在覆写的时候不需要声明为虚方法。

 public abstract class Program
{
public abstract void A();
public abstract void B();
}
public class C : Program
{
public override void A()
{
Console.WriteLine("China");
}
public override void B()
{
Console.WriteLine("Hello");
}
public static void Main()
{
C me = new C();
me.A();
}
}

  4.接口:Interface + 类名

    (1)接口用来实现多继承,一个类只能有一个父类,但可以继承多个接口。

    (2)接口是一种特殊的抽象类,它里面规定得更严格,里面的方法只能为抽象方法。

    (3)定义一个接口的时候,一般为缺省,即 Interface+类名,前面自动加上了public abstract。定义接口中的方法时,也只需要写返回类型 + 方法名即可,也默认为public abstract。

    (4)接口里面的所有成员都是公共的,抽象类里面的成员可以是私有的,公共的,受保护的。

    (5)一个类继承于一个接口,就必须完成接口中所有方法的实现。

    (6)接口不能包含字段、构造函数、静态变量或者常量等。

  5.泛型:为避免反复装箱拆箱过程,所以引入泛型。它将装入的数据类型声明好,只允许此种类型的数据加入。在System.Collections.Generic命名空间中。

    非泛型集合类与泛型集合类的对照关系:ArrayList---List<T>;HashTable---Dictionary<T>;Stack---Stack<T>。

后记:课下学习。

ASP.NET动态网站制作(21)-- C#(4)的更多相关文章

  1. ASP.NET动态网站制作(3)--css(2)

    前言:css分为四次课讲完,第一节课内容见ASP.NET动态网站制作(2)--css(1),接下来的内容会涉及到定位.浮动.盒子模型(第二次课).css的具体应用(第三次课).css3(第四次课).今 ...

  2. ASP.NET动态网站制作(20)-- C#(3)

    前言:C#的第三节课,继续上次课的内容,依旧围绕基础的只是讲解. 内容: 1.StringBuilder类:由于string类一旦创建,则不能更改.如果做字符串拼凑的话,将会非常耗费空间,如: str ...

  3. ASP.NET动态网站制作(1)--html

    前言:正式上课的第一课,讲的是前端部分的最基础内容:html. 前端:html,css,js 数据库:sql server 动态部分:.net,c#... IIS(Internet Informati ...

  4. ASP.NET动态网站制作(0)

    前言:一直想系统地学习一下网站建设的相关内容,看过相关的书籍,也跟着视频学过,但总觉得效率不高,学过的东西印象不深刻,或许还是自己动手实践的少.无意中免费听了一堂讲ASP.NET网站建设的课,觉得性价 ...

  5. ASP.NET动态网站制作(28)-- 三层框架(2)

    前言:三层框架的第二节课,继续上次课的内容. 内容: 1.三层框架的使用目的:可以将视图层和业务逻辑层及实体层分开,可以提高代码的扩展性,安全性,可以实现程序的低耦合性. 2.GetModel方法及G ...

  6. ASP.NET动态网站制作(26)-- Ajax

    前言:这节课讲解关于Ajax的相关内容. 内容: 1.当点击页面中的一个按钮提交数据或请求数据的时候,整个页面的信息都会提交(不管信息是否是提交或者请求的数据,页面中所有的数据都提交),这样耗用的时间 ...

  7. ASP.NET动态网站制作(25)-- ADO.NET(4)

    前言:这节课老师主要讲网页当中内容的分页效果,自己写一个分页控件. 内容: 1.首先写出HTML代码: <div id="pager"> <%=GetPagerH ...

  8. ASP.NET动态网站制作(24)-- ADO.NET(3)

    前言:ADO.NET的第三节课.今天主要讲SQL Helper. 内容: 1.DataReader和DataSet的区别: (1)DataReader是一行一行地读,且只能向前读:DataSet是一次 ...

  9. ASP.NET动态网站制作(22)-- ADO.NET(1)

    前言:这节课开始真正地学习WEB开发,ADO.NET就是一组允许.NET开发人员使用标准的.机构化的,甚至无连接的方式与数据交互的技术.所属的类库为:System.Data.dll. 内容: 1.AD ...

随机推荐

  1. 关于可变参数列表stdarg

    1.对于可变参数 可变参数列表通过stdarg.h中的宏实现: 主要有一个va_list类型 三个宏:va_start,va_arg,va_end; va_start格式: va_start(argu ...

  2. [转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析

    本菜最近学习了什么DLL注入啊,hook啊(r3)的相关技术,觉得很好玩,于是深入发现还有DLL劫持这种东西觉得挺好玩的,加上最近看到各种木马分析报告中都还有发现有利用白加黑的现象.于是自己想找几个来 ...

  3. Ubuntu系统日志

    一.指定系统日志路径到:  /var/log/messages 1.默认系统日志 root@HDController:~# tail -1000 /var/log/syslog Oct 20 06:2 ...

  4. .net开发常用的第三方开发组件

    转自:http://www.cnblogs.com/damsoft/p/6100323.html .net开发常用的第三方组件: 1.RSS.NET.dll: RSS.NET是一款操作RSS feed ...

  5. 转: 通过Servlet生成验证码图片

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(九)—— 通过Servlet生成验证码图片 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedIma ...

  6. 安装openstack 时 遇见的一些问题及解决方法!

    感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免.欢迎指正! 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  7. Java中的回调函数学习-深入浅出

    Java中的回调函数一般来说分为下面几步: 声明回调函数的统一接口interface A.包括方法callback(); 在调用类caller内将该接口设置为私有成员private A XXX; 在c ...

  8. 虚拟机只有IPv6,没有ipv4

    1.修改配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none HWADDR=00:0C:29:20: ...

  9. CodeForces 659E New Reform

    题意:给你一个无向图,如今要求你把边改成有向的. 使得入度为0的点最少,输出有多少个点入度为0 思路:脑补一波结论.假设有环的话显然没有点入度为0,其余则至少有一个点入度为0,然后就DFS一波就能够了 ...

  10. POJ 3687:Labeling Balls(优先队列+拓扑排序)

    id=3687">Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10178 Acc ...