C#面向对象学习笔记
课程一:面向对象的概念。
英文缩写: OOP。
面向对象只是面向过程的一个补充,而不是取代面向过程。
类、对象。类是抽象的,对象是具体的。 人是一个类,某一个人是“人”这个类的对象。和类相关的变量叫做字段,是类的状态。类是不占内存的,对象才占内存。
方法:就是类能够执行的动作,比如问好、吃饭。
类的继承:类之间可以有继承关系。比如电脑类可以从电器类继承,这样做的好处是“电脑”类,只需要定义自己特有的字段、方法就可以啦。
面向对象的三个特征:封装、继承、多态。
课程二:定义类。
看看这个程序,基本上包含了类的定义,类的对象的声明、对象的字段的赋值等等。
课程三:类的成员访问级别.
在定义类的成员是,前面有一个关键字,例如上面的public。Public就是指公开的意思,在程序的任意地点都可以改变该成员的值。
还有一个访问级别限制关键字:private 只能在类里面才能够改变其值。
看看这个函数:
如果类里面的“方法”中参数更类的成员重名。要用this.name来指定哪个名字是类的成员名而不是参数名。看看下面的一个类的定义。其实,不同名也是可以用this关键字的。
课程四:面向对象 属性。
简化字段的引用和赋值:因为,为了避免字段被擅自更改,字段要设为private。
然后针对某这字段设置属性。属性里面有set 和get 两个动作,可以改变字段的值。
课程五:构造函数:
构造函数是类的一个函数。例如在声明类的一个对象是:Persion p1=new Person();
Person是一个类。P1是类的对象。
Person()就是person这个类的构造函数。默认是没有参数的。
但是如果你希望你声明的类的某个某个对象有初始值,就可以声明构造函数并传参数进去。构造函数可以有重载。看看下面的程序:
这里说明一下,上面函数的Gender性别显然是不可以被外界更改的。所以不能用{set;get;}这样的话,就必须用传统的:
private Gender gender;
public Gender gender
{
get{return this.gender;}
}
还有,在看看上面函数的两个构造函数,里面赋值字段的代码存在冗余,这不符合编程原则DRY(Don’t Repeat Yourself)。如何解决呢,可以使用函数的嵌套调用。
如下所示:
构造函数的嵌套调用:在一个函数的后面加“:this(参数)”
课程 6 :类的继承。 主要作用是类的属性、方法的重用。例如:首先定义一个Person类,如果需要再定义一个Chinese类。那么“中国人”类就可以从“人” 类中继承字段、属性、方法的。例如下面一段代码:
如果一个类,没有定义父类,则它默认为object类。Object 是任何类的直接或间接父类。
子类在继承父类的一个方法的时候,不能够默认继承,因为在子类中用继承下来的方法可能是不合适的,需要更改这个方法。怎样更改呢。
首先在父类的方法前要加virtual关键字。
在子类中的方法:
Chinese类是Person类的子类,Person类是object类的子类。而object是支持.ToString方法的。
所以,Person,Chinese类也是支持的。可以用覆盖的方法,改变.ToString方法的行为。例如可以在Person 类中覆盖object类的.ToString方法。
在C#中,一个类只允许有一个父类。而在C++中是可以有多个父类的。
父类声明的一个构造函数,子类能否继承呢。如果可以那又该怎样做。
构造函数是不能够继承的,每个子类都必须自己声明构造函数。
虽然不能够继承,但是子类可以调用父类的构造函数 。
Person 父类中声明构造函数。
子类Chinese中声明构造函数:
构造函数的使用。
课程七:多态
一个父类的指针,可以指向其子类的一个对象。
例如:Person p1=new Chinese();
P1.SayHello();//如果子类和父类中有SayHello方法这是正确的引用。
如果只是子类中有这个方法,而父类中不确定有没有这个方法,则是错误的。
课程八:多态的好处。