`

C#面向对象学习笔记(一)

阅读更多

这几天,项目比较空一点,正在重点看一下C#基础语法,感觉面向对象那一部分,有些地方还是满疑惑的。

参考了《C#高级编程》第四版   第3和4章  边看边总结了点笔记

 

C#中的继承(第4章 继承)
1.继承的类型
(1)实现继承
表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数

(2)接口继承
表示一个类型只继承了函数的签名,没有继承任何实现代码。
接口继承通常被看作提供了一种契约,让类型派生于接口,来保证为客户提供某个功能

(3)多重继承
C#不支持多重继承,C#允许类型派生于多个接口
System.Object是一个公共基类,所以每个C#类(除Object),都有一个基类,还可以有任意多个基接口

(4)定义结构和类的总结:
结构总是派生于System.ValueType,还可以派生于任意多个接口
类总是派生于用户选择的另一个类,还可以派生于任意多个接口

2.实现继承
class A:B    A类派生于B类
{

}

class A:B,IInterface1,IInterface2   同时也派生于接口
{

}

其实,如果在类定义中没有指定基类,C#编译器就假定System.Object是基类
C#支持object关键字,作为System.Object类的假名

 

(1)虚方法
把基类声明为virtual,那么该方法就可在任何派生类中重写
public virtual string xxxxMethod(){

}

也可以把属性声明为virtual
public virtual string xxxxx
{
get{....}
set{....}
}

C#中虚方法可以在派生类中重写,在调用方法时,会调用对象类型的合适方法
派生类重写虚方法时要使用override关键字显式声明
成员字段和静态方法都不能声明为virtual

(2)隐藏方法
如果签名相同的方法在基类和派生类中都声明,但该方法没有声明为virtual和override
那么派生类方法会隐藏基类方法

同时C#会给出警告,使用new关键字声明要隐藏一个方法
在派生类方法前使用new,则可以关闭这个警告

当派生类方法前使用了new,而实际上该方法并没有覆盖基类的方法,那么编译器也会发出警告

(3)调用方法的基类版本
派生类中调用方法的基类版本:base.MethodName()
也可以使用base() 来调用基类构造函数

以上主要讨论了基类,派生类的方法,其规则也使用于属性

 


(4)抽象类和抽象方法
abstract关键字

抽象类不能实例化
抽象方法没有实现代码,必须在非抽象的派生类中重写(实际上抽象方法也是虚的,但不需要提供virtual)
如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的 abstract


(5)密封类和密封方法
sealed关键字
对于类来说表示不能继承该类

对于方法来说表示不能重写该方法
注意:在方法上使用sealed是没有意义的,除非该方法本身是某个基类上另一个方法的重写形式
如:
class MyClass
{
 public sealed override void MethodA(){}   //MethodA方法在基类中已经是一个重写形式
}
//这里的sealed 关键字其实就是确保了MethodA在此处重写的代码是最终版本,其它人不能再重写它了

class TowClass:MyClss
{
 public override void MethodA(){}   //错误,因为MethodA方法不能被重写
}


如定义一个新方法不想让别人重写,则首先就不要声明为virtual

 

(6)派生类的构造函数
当没有为类定义任何显式的构造函数,编译器会为所有的类提供默认的构造函数,并且能够很好的
解决类层次结构中的所有问题

基类
abstract class BaseA
{
 private string name;
}


子类
class A:BaseA
{
 private int id;
}

描述实例化派生类时发生的情况:
假定默认的构造函数在整个层次结构中使用
编译器首先找到它试图实例化的类的构造函数,是A,而这个默认 A构造函数首先是为其直接基类BaseA运行默认
构造函数——》BaseA构造函数同样继续为其直接基类System.Object运行默认构造函数
而System.Object没有任何基类,其构造函数执行,并把控制返回BaseA——》执行BaseA构造函数,将name初始化为null
控制权返回给A——》执行A构造函数,将id初始化为0,并退出

注意:构造函数的调用顺序是先调用System.Object,再按照层次结构由上向下进行,直到编译器要实例化的类为止
每个构造函数都初始化它自己类中的字段


添加构造函数
第一:在层次结构中添加无参数的构造函数(用无参数的构造函数替换默认构造函数)
比如,要将上述BaseA class中的name初始化为"no name"
public abstract class BaseA
{
 private string name;
 public BaseA():base()  //:base() 表示添加了一个对基类构造函数的调用
 {
  name="no name";
 } 
}


当然针对此类,:base() 则可以不写
因为编译器在构造函数的“{”前面没有找到对另一个构造函数的任何引用,就会假定我们要调用基类构造函数
对于此类 事实上都是调用System.Object构造函数


第二:在层次结构中添加带参数的构造函数
如:

public abstract class BaseA
{
 private string name;
 public BaseA(string name)
 {
  this.name=name;
 } 
}

这样的情况,则在实例化A的时候,编译出错,因为编译器为A生成的默认构造函数会试图调用无参数的
BaseA构造函数,而由于BaseA中定义了带参数的构造,所以BaseA中没有默认的构造函数了.
因此,需要为派生类也提供一个带参数的构造函数来避免错误
如:
 
class A:BaseA
{
 private int id;

 //A构造函数本身不能实例化name字段(不能访问基类中私有字段),但可以把name传给基类
 public A(string name):base(name)
 {
 }
}

 

第三:重载构造函数和一个类的层次结构
如:
class A:BaseA
{
 private int id;
 private refName;
 
 //构造函数1
 public A(string name,string refName):base(name)
 {
  this.refName=refName;
 }

 //构造函数2
 public A(string name):this(name,"none"){
  
 }
}

当执行 A a=new A("Hello");就会调用 构造函数2 ,之后立即把控制权传给对应的 构造函数1,这个函数带2个参数
分别是"Hello"和"none";在这个构造函数中依次把控制权传给BaseA构造,该构造带有1个参数——字符串"Hello".
然后继续——》System.Object默认构造函数

开始执行构造函数:首先System.Object构造函数——》执行BaseA构造函数,初始化name
——》2个参数的A构造,初始化refName为"none"——》执行1个参数的A构造(什么也不做)


在为类编写自己的构造函数时遵循上述规则,则可以避免任何问题,顺利初始化

 

 

分享到:
评论

相关推荐

    C#面向对象学习心得.txt

    C#面向对象学习心得.txt

    c#面向对象基础学习笔记-配套传智播客视频

    本txt为传智播客视频第2部分C#面向对象 所对应的笔记整理,参考视频学习,学习效率更高。视频可在 http://www.verycd.com/topics/2857178/ 免费下载,有需要的给我留言

    Visual C#学习笔记光盘

    简介:本书由浅入深地讲解Visual C# 2005编程知识,全书内容分为6篇,共27章,第一篇介绍Visual Studio 2005开发环境和C#基础,其中包括Visual C# 2005简介,C#语言基础,面向对象编程基础,数组类和集合类,...

    C#6.0学习笔记——从第一行C#代码到第一个项目设计(第一个包)

    全书共包括21章,分别介绍了以下内容: 开发环境搭建、语法基础、面向对象编程、类型转换、字符串处理与数学运算、控制台应用程序、变体的应用、集合与泛型、调试与单元测试、Lambda表达式、LINQ查询语句、Windows...

    C#6.0学习笔记——从第一行C#代码到第一个项目设计(第二个包)

    全书共包括21章,分别介绍了以下内容: 开发环境搭建、语法基础、面向对象编程、类型转换、字符串处理与数学运算、控制台应用程序、变体的应用、集合与泛型、调试与单元测试、Lambda表达式、LINQ查询语句、Windows...

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

    C#学习笔记

    我个人觉得面向对象是本本主义、洁癖的体现、是重构后的最后归属、它可能会矫情、在市场变化老板着急产品狭隘的情况下 快速制作快速上线才是王道,面向对象的基础是对事物的详尽认知,短时间内能做到吗 不好做到,...

    c#学习笔记2

    C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它...

    面向对象的范式

    C#学习笔记,利用面向对象的方式进行操作数据库以及进行学习使用

    C#中面向对象编程机制之多态学习笔记

    主要介绍了C#中面向对象编程机制之多态学习笔记,本文总结了个人对多态的理解以及接口多态、继承多态等内容,并给出了代码示例,需要的朋友可以参考下

    C#中面向对象编程机制之继承学习笔记

    主要介绍了C#中面向对象编程机制之继承学习笔记,本文给出一个简单子实例讲解C#中的继承,并讲解了一些C#继承的知识技巧,需要的朋友可以参考下

    c#学习笔记

    C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它...

    C#ch03笔记3.jpg

    java面向对象学习编程笔记核心整理

    C#ch06笔记1.jpg

    java面向对象学习编程笔记核心整理

    C#ch06笔记2.jpg

    java面向对象学习编程笔记核心整理

    C#ch04笔记1.jpg

    java面向对象学习编程笔记核心整理

    C#ch03笔记1.jpg

    java面向对象学习编程笔记核心整理

    C#ch07笔记1.jpg

    java面向对象学习编程笔记核心整理

    C#学习笔记——基本语法

    C#是一种面向对象的编程语言。在面向对象的程序设计方法中,程序有各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是在先沟通那个的class中。 例如,以Rectangle(矩形)对象为例,它具有length和...

Global site tag (gtag.js) - Google Analytics