数往知来C#面向对象〈三〉
标签:
C# 基础方法篇一、复习
1)方法的重载
方法的重载并不是一个方法,实际上方法的重载就是一些不同的 方法,目的是为了方便程序员编码,所以将功能相近的方法命名相同
根据参数,编译器自动的去匹配方法体,而不需要程序员记住 的方法
--》如何判断重载写的对不对
将方法的定义拿出来,去掉修饰符,去掉方法体,去掉返回类型
int InputNum() int InputNum(int max) int InputNum(int min,int max)
-->将参数列表中的局部变量名去掉,只留参数类型
int InputNum() int InputNum(int ) int InputNum(int ,int )
二、封装
-》属性是对字段的封装
-》 方法是对过程的封装
-》类是对对象的封装(特性和功能)
-》程序集是对类库的封装
为什么使用继承?
-》代码的重用
-》实现多态(里氏转换)
继承中类分为父类(基类)与子类(派生类)
基类
将具有共同特征的这个类,单独写出来,称为父类(基类)
子类
继承父类所有的特征,也可以有属于自己不同的特征。
父类(基类):把这个类的对象都具有的一些特征和行为等都封装到这个类里面。
然后由这个父类派生出子类(派生类),这些子类会把父类里的特征(属性)行为(方法)等继承下来。从而实现代码的重用
例如:
class Person { string _name; int _age; char _sex; public string Name { get { return _name; } } public int Age { get { return _age; } } public char Sex { get { return _sex; } } public Person(string name,int age,char sex) { _sex = sex; _name = name; _age = age; } public void SayHello() { Console.WriteLine("大家好,我叫{0},今年{1}岁了,我是{2}生",_name ,_age ,_sex ); } } class student : Person { public student(string name,int age,char sex):base(name,age,sex) { //方法体 } public void SayHello() { Console.WriteLine("大家好,我叫{0},今年{1}岁了,我是{2}生",Name ,Age ,Sex ); } }
这里student类是person的派生类,它继承了person类的所有成员包括SayHello方法,这里Student的sayhello方法把父类的sayhello方法给隐藏了
继承的特征
-》单根性(只能继承一个基类)
-》传递性(子类可以继承基类的成员。字段、属性、方法等)
-》 派生于object根类(基于C#)(为什么要有根类?还是为了实现多态)
注意问题
-》构造方法的问题
创建对象的时候,好像是先调用子类构造方法,然后由子类再调用父类构造方法,
再调用构造方法的时候,其实默认有一个base(),调用了父类的无参构造方法
语法:
class 基类
{
//基类成员
}
class 子类:基类
{
//子类可以有自己的成员
//基类的成员也会被继承下来
}
子类于父类构造方法的执行顺序
Student student = new Student();
这里New子类对象时会先走到子类的构造方法,这里系统会默认提供一个base()无参的构造方法。如果父类中有了有参的构造方法,系统就不会再分配无参的构造方法,
此时如果子类调用父类的构造方法就会报错,因为父类的无参构造方法已经没有了。解决办法由两个
1)再手动在父类中添加一个无参的构造方法。
2)base(参数列表)传参数上去。
public student(string name,int age,char sex):base(name,age,sex) 这里不执行下面的大括号,然后base调用父类的构造方法,如果父类上面还有父类会依次往上调,
直到调到最上面的父类执行完最上面的父类构造方法然后再依次的往下执行回到这个子类,执行剩下的方法体
{
//方法体
}
this和base关键字:
this表示当前类 当前构造方法
base表示父类 父类构造方法
经典例子:
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67697.html