您的位置:首页 > 编程语言 > C#

C#基础知识复习1代码规范-执行流程(c#)-面向对象-引用命名空间-封装-继承-访问修饰符-虚方法-静态成员-多态-抽象类等

2015-02-14 09:35 1241 查看
1、代码规范

规则(法律,必须遵守否则报错)

•    语法

规范(道德,大家都喜欢有道德的人。)

•    注意释

•    骆驼命名:第一个单词首字母小写,之后的单词首字母大写userName、userPassword、realName…(普通变量(局部变量)、字段)

•    帕斯卡命名:第一个单词首字母大写,之后的单词首字母大写GetMax()、ChangeName()…(方法名、类名、属性名

•    定义的变量或者方法名字要有意义。

•    方法名:动词。Write()、Open()、Close()、Dispose()、GetUserId()、…(方法都是要做一件事情)

•    变量名:按功能命名、按方法的返回值内容命名(userName=GetUserName();)

2、.net程序基本编写、执行流程(c#)

(1)编写c#代码,保存为.cs文件。

(2)通过csc.exe程序来将.cs文件编译为.net程序集(.exe或.dll)。此时的exe或dll并不是机器码(cpu不可理解)。【>csc/out:c:\a.exe
c:\program.cs】

(3)程序运行时通过JIT编译(Just InTime)即时编译,将程序集编译为cpu能理解的机器码,这时cpu才能执行。(这个编译过程会与当前机器有关(根据当前机器的内存、cpu等))。

3、面向对象(OO)

什么是面向对象?一种分析问题的方式(增强了程序的可扩展性)。

面向对象三大特性:封装、继承、多态。

什么是类?什么是对象?类和对象的区别?如何写一个汽车类?

•    类是模具,创建对象的模具,抽象的。

•    类是一种数据类型,用户自定义的数据类型

•    类组成:字段、属性、方法、构造函数等

•    对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行为)

•    类中包含了数据(用字段表示)与行为(用方法(函数、功能)表示,方法为一块具有名称的代码)

this ,当前对象

练习:猜拳游戏。先分析类和对象。实现WinForm版本与控制台版本。

4、添加引用与导入命名空间的区别

(1)添加引用(前提)

•    添加程序集

(2)导入命名空间

•    namespace (ctrl+ .或shift + alt + F10)

(3)为什么在另一个项目中建的类,添加引用后还是不能使用?(类的访问修饰符默认:internal,改成public)

“参数”与“返回值”

•    参数的个数、类型与返回值没有任何半毛钱关系。

5、封装

类和对象本身就是封装的体现。

1.属性封装了字段、2.方法的多个参数封装成了一个对象、3.将一堆代码封装到了一个方法中、4.将一些功能封装到了几个类中、5.将一些具有相同功能的代码封装到了一个程序集中(dll、exe),并且对外提供统一的访问接口。(属性名、方法名等。)

6、继承(是指类与类之间的关系。)

(1)车 (Vehicle) 

•    —卡车(Truck)

•    轻型卡车

•    重型卡车

•     —
轿车 (Car)

•    --小轿车

•    面包车

如何判断一个继承关系是否合理?子类isa父类。

Base Class→基类、ParentClass→父类

Derived Class→派生类、ChildClass→子类

(2)为什么要继承?继承带给我们的好处?

•    代码重用

•    LSP里氏替换原则(通过代码说明一下,声明父类类型变量,指向子类类型对象,以及调用方法时的一些问题)、多态。(程序的可扩展性、灵活性)方法重写override。虚方法的原理:虚方法表。

•    子类继承父类的属性和方法,使创建子类变得很简单,实现了代码重用、以及多态。

•    类的单根继承性、传递性、继承时构造函数的问题。构造函数不能被继承。

(3)所有的类都直接或间接的继承自object。

(4)关于继承的那些事儿

protected 

•    只能在子类内部和当前类内部中使用

•    可以在类内部以及所有子类中(内部)访问。

this:

•    1.作为当前类的对象,可以调用类中的成员。this.成员(调用成员,自己)

•    2.调用本类的其他构造函数。:this()(调用构造函数,自己)

base   :

•    1.调用父类中的成员(在子类重写父类成员或者子类使用new关键字隐藏了父类成员时,调用父类成员)base点不出子类独有成员。

•    2.调用父类中的构造函数(调用构造函数,父类)

•    当调用从父类中继承过来的成员的时候,如果子类没有重写则this.成员;与base.成员;没有区别。如果子类重写了父类成员,则this.成员;调用的是子类重写以后的。base.成员;调用的依然是父类的成员。

子类构造函数必须指明调用父类哪个构造函数

类中的成员如果不写访问修饰符默认是private.

7、访问修饰符

共5种:

•    private
当前类中可以访问,类中成员的默认访问修饰符

•    protected
当前类及子类中可以访问(在继承中用。)

•    internal当前程序集内部可以访问

•    protected internal当前程序集或子类中(不同程序集也可以访问)。

•    public
任何地方

访问级别约束

•    子类的访问级别不能比父类的高。(会暴露父类的成员)

•    类中属性或字段的访问级别不能比所对应的类型访问级别高。

•    方法的访问级别不能比方法的参数和返回值的访问级别高。

8、虚方法virtual 实现多态的手段1

(1)Person→Chinese→American→Korean,每个国家的人都有一个说出自己国籍的方法。当有一个Person[]的时候,循环现实每个国家的人。

虚方法可以给父类中的方法一个实现,比如ToString()方法

虚方法必须有实现部分,哪怕是空实现。

(2)虚方法和抽象方法的区别。Abstrcat

•    virtual方法表示此方法可以被重写,也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.

virtual方法可以直接使用,和普通方法一样
不是必须重写的. 子类可以使用base.方法的方式调用,无论有没有在子类使用override去重写

•    virtual关键字只是明确标示此方法可以被重写,其实它和一般的方法没有什么区别

•    相应的sealed关键字标示此方法不可以被重写

虚方法和抽象方法的区别:

•    虚方法可以有实现体,抽象方法不能有实现体。

•    抽象方法要求派生类必须重载这个方法;

(3)子类重写父类方法时,必须与父类保持一致的方法签名与返回值类型。即:方法名、返回值类型、参数列表都必须保持一致。[访问修饰符也得一致]

“方法签名”:一般是指方法的【名称】+方法的【参数列表】,不包含方法返回值类型

9、静态成员-通过类名访问、实例成员-通过对象访问

(1)C#中声明的所有的变量都需要在类型中,不能在类型以外直接声明全局变量,与c或c++不同。没有全局变量的概念。

(2)静态成员是与“类”相关,而非与“实例”相关。

(3)普通类中的静态成员static

•    只能通过类名访问

•    静态方法中只能访问静态成员,或通过对象访问实例成员。

•    多个对象共享同一个静态成员。

(4)静态类(一般都用作工具类,里面都是一些工具函数)

•    Math、Console、Convert等都是静态类。

•    静态类中只能包括静态成员

•    静态构造函数不能有参数、不能有访问修饰符(默认为private)。静态构造函数在第一次使用该静态类的时候只执行一次。

(5)静态成员属于类所有,非静态成员属于类的实例所有

(6)C#静态方法属于类所有,类实例化前即可使用

(7)在实例方法中可以直接调用静态方法,在静态方法中不可以直接调用实例方法

(8)静态方法和静态变量创建后始终使用同一块内存(静态存储区),而使用实例的方式会创建多个内存

10、多态

(1)开放封闭原则(对修改封闭,对扩展开放。)

(2)多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在不同的场合下表现出不同的行为特征

(3)多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

(4)里氏替换原则

•    父类引用指向子类对象Personp=new Chinese();(隐式类型转换)

•    父类对象不能够替换子类Chinesec=(Chinese)new Person();(×)

(5)is-a:可以用来验证继承关系中是否合理。(can do,验证实现接口是否合理*)

if(obj is
类型A)//obj是父类类型对象,”类型A”是子类类型。

(6)关键字as (类型转换)、is(通常类型转换前需要通过is来判断一下类型。)

11、实现多态的方式

(1)virtual,子类重写父类中的方法。

(2)abstract,子类重写父类中的方法。

(3)接口,实现接口的类,将接口中的方法实现。

12、怎么实现多态1-抽象类abstract

(1)抽象类不能被实例化。抽象类中可以有普通成员。

(2)抽象类存在的意义:1.抽象类不能被实例化,只能被其他类继承2.继承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除非子类也是抽象类。)3.抽象类就是为了重写→多态(代码重用)。4.抽象类中可以有实例成员也可以有抽象成员。

(3)什么是抽象类(光说不做)

•    不能被实例化的类(不能new)

抽象类的特点

•    见备注

练习2:计算形状Shape(圆Circle,矩形Square ,正方形Rectangle)的面积、周长

13、new(*)隐藏、截断(了解)

方法的隐藏

Swim方法是子类特有

class RubberDuck:Duck

    {

        //方法的隐藏

        //子类特有的方法,只不过方法名和父类重名了

        public new void Swim()

        {

           Console.WriteLine("swim被改变了");

        }

}

如果一个方法在子类中被重写

                 Duck duck = new RubberDuck();  duck.Bark()调用子类的方法,因为被重写了。

抽象方法子类必须重写所以不能用new.

使用第三方dll的时候,原来没有SayHi方法,自己继承后加了个SayHi(),后来第三方dll更新,也加了个SayHi(),继承后的类中现在就得用new了。

14、设计模式(GOF23种设计模式)

各种设计模式的本质都是:多态。充分理解了多态,再看设计模式就会觉得轻松很多。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# 面向对象 多态
相关文章推荐