C#图解教程读书笔记(第7章 类和继承)
1、所有的类都继承自object
2、如何隐藏基类的成员
要隐藏一个继承的数据成员,需要声明一个新的相同类型的成员,并使用相同的名称。
通过在派生类中声明新的带有相同签名的函数成员,可以隐藏或掩盖继承的函数成员。请记住,签名由名称和参数列表组成,但不包括返回类型。
要让编译器知道你在故意隐藏继承的成员,使用new修饰符,没有它,程序可以成功编译,但编译器会警告你隐藏了一个继承成员。
也可以隐藏静态成员。
class SomeBase
{
public string cFiled;
}
class SomeClass : SomeBase
{
new public string cFiled;
}
3、基类访问使用base.的形式。
4、虚方法和覆写方法
基类的方法使用virtual,派生类的方法使用override,这样,就可以在派生类中,改变基类的方法。
覆写的方法和被覆写的方法必须有相贩 可访问性,换一种说法,被覆写的方法不能是private,而覆写的方法是public。
不能覆写static或非虚方法。
方法、属性和索引,以及称为事件的另一种类型,它们都可以被声明为virtual和override。
用override和new覆写函数
class Program
{
static void Main(string[] args)
{
MyBaseClass cBase = new MyBaseClass();
cBase.Print();
MyDerivedClass cDevrived = new MyDerivedClass();
cDevrived.Print();
SecondDerived cSecond = new SecondDerived();
cSecond.Print();
MyBaseClass cBase2 = (MyBaseClass)cSecond;
cBase2.Print();
cBase2.Print2();
Console.ReadKey();
}
}
class MyBaseClass
{
virtual public void Print()
{
Console.WriteLine("This is the base class");
}
virtual public void Print2()
{
Console.WriteLine("This is the base class");
}
}
class MyDerivedClass : MyBaseClass
{
public override void Print()
{
Console.WriteLine("This is the derived class");
}
override public void Print2()
{
Console.WriteLine("This is the derived class");
}
}
class SecondDerived : MyDerivedClass
{
public override void Print()
{
Console.WriteLine("This is the Second Derived Class");
}
new public void Print2()
{
Console.WriteLine("This is the Second Derived Class");
}
}
输出内容:

用override不仅可以覆写函数,还可以覆写属性。
5、构造函数的顺序

6、声明为public的程序,可以跨程序集继承。
7、访问成员的区域
private 只在类的内部可访问
internal 对该程序集内所有类可访问
protected 对所有继承该类的类可访问
protected internal 对所有继承该类或在该程序集内声明的类可访问
public 对任何类可访问
8、抽象成员
用abstract修饰符标记,方法、属性、事件、索引均可以抽象。抽象成员没有实现体,被分号取代。而且必须被覆写。
①尽管抽象成员必须在派生类中用相应的成员覆写,但不能把virtual修饰符加到abstract修饰符。
②就像虚成员,派生类中抽象成员的实现必须指定override修饰符。
9、抽象类
抽象类只能用作其它类的基类不能实例化。用abstract声明。
任何派生自抽象类必须使用override关键字实在该类所有的抽象成员,除非派生类自己也是抽象类。
10、密封类
用sealed声明,必须是独立的类,不能用作基类。
11、静态类
静态类需要声明为static,所有成员必需是静态的,可以有静态构造函数,但没有实例构造函数,不能创建该类的实例。静态类是隐匿是密封的。
12、扩展方法
class MyData
{
private double dbD1;
private double dbD2;
private double dbD3;
public MyData(double d1, double d2, double d3)
{
dbD1 = d1;
dbD2 = d2;
dbD3 = d3;
}
public double Sum()
{
return dbD1 + dbD2 + dbD3;
}
}
static class ExtendMyData
{
public static double Average(this MyData md)
{
return md.Sum() / 3;
}
}
则可以直接用以下方法调用:
MyData md = new MyData(3, 4, 5);
Console.WriteLine("Average:{0}", md.Average());
Console.ReadKey();
this必需作为第一参数,如果需要给 Average加参数,参考如下:
public static double Average(this MyData md,int icount)
{
return md.Sum() / icount;
}
调用时:
MyData md = new MyData(3, 4, 5);
Console.WriteLine("Average:{0}", md.Average(3));
Console.ReadKey();
C#图解教程读书笔记(第7章 类和继承)的更多相关文章
- SQL Server2012 T-SQL基础教程--读书笔记(1-4章)
SQL Server2012 T-SQL基础教程--读书笔记(1-4章) SqlServer T-SQL 示例数据库:点我 Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的 ...
- SQL Server2012 T-SQL基础教程--读书笔记(5-7章)
SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5. ...
- 【C#4.0图解教程】笔记(第1章~第8章)
第1章 C#和.NET框架 1..NET框架的组成 .NET框架由三部分组成(严格来说只有CLR和FCL(框架类库)两部分),如图 执行环境称为:CLR(公共语言运行库),它在运行期管理程序的执行. ...
- C++ primer plus读书笔记——第13章 类继承
第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生 ...
- C++ primer plus读书笔记——第12章 类和动态内存分配
第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化 ...
- C#图解教程读书笔记(第2章 C#编程概述)
这章主要是一个对于C#程序的概括解释 和C/C++不同,不是用include声明引用的头文件,而是通过using的方式,声明引用的命名空间. 命名和C/C++类似,并且也是区分大小写的,这件事情在VB ...
- C#图解教程读书笔记(第1章 C#和.net框架)
C#中的主要需要记住的基础概念 CLR公共语言运行库 CIL中间语言,所有的代码都会编译成中间语言. CLI公共语言基础结构 C#的优点 C#有自动垃圾回收机制
- C#图解教程读书笔记(第15章 委托)
委托是C#的一个很重要的知识点. 1.什么是委托 委托在我认为,就是一系列格式相同的方法列表,可能就是定义的名称不一致,参数.返回值等都是一样的. 2.如何声明委托 delegate void MyF ...
- C#图解教程读书笔记(第9章 语句)
文件头的Using是Using指令,不是using语句 using (TextWriter tw = File.CreateText("xixi.txt")) { tw.Write ...
- C#图解教程读书笔记(第8章 表达式和运算符)
表达式 字面量 整数字面量 字符字面量 字符串字面量 求值顺序 优先级 结合性 与C和C++不同,在C#中的数字不具有布尔意义. 各种运算符的作用(过) 用户定义类型转换 class XiXiInt ...
随机推荐
- ExtJs6编译之后上线报错无法查看到的解决方法
最近Extjs编译后部署遇到了一个错误c is not a constructor,报错位置在app.js里,这根本没法找 解决方法:用命令sencha app build testing 编译之后, ...
- CentOS7配置中文
CentOS7配置中文 yum install kde-l10n-Chinese -y vim /etc/locale.conf修改为zh_CN.UTF-8 vim /etc/environment添 ...
- js 对象数据观察者实现
var observer = function (originalData) { var newData = {}; newData.observer = {}; newData.$data = {} ...
- nodejs图片裁剪、缩放、水印
关于nodejs下图片的裁剪.水印,网上的模块很多,主要如下: gm:https://github.com/aheckmann/gm node-canvas:https://github.com/Au ...
- CSS 文字超长省略显示并隐藏超长部分
1.包含文字的元素必须是块级元素,不是块级元素使用display:block使其具有块级元素属性: 2.具备上述基本条件后,css样式如下: { display: block; max-width: ...
- ps命令详解加例子
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- DataTables获取指定元素的行数据
法1: 用jquey获取,var row = $('.edit').parent().parent(); 缺点:只能获取dom上的东西,不能获取没有渲染的数据 法2: 首先绑定行号到元素上 $('#e ...
- 三 Buffer
使用Buffer一般遵循以下四个步骤 写入数据到Buffer 调用flip() 从Buffer中读取数据 调用clear()或者compact()方法 当向buffer写入数据时,buffer会记录下 ...
- new date()标准时间转yyyy-mm-dd hh:mm 24小时制
<!DOCTYPE html> <html> <head> <title>new date()标准时间转yyyy-mm-dd hh:mm 24小时制&l ...
- 为My97DatePicker日期插件设置默认日期
datepicker.zip 为My97DatePicker日期插件设置默认日期,开始日期为系统日期的前一个月,结束日期为系统日期: 开始日期不能大于结束日期,且都不能大于今天: 开始日期-maxDa ...