博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#基础复习--第一部
阅读量:6797 次
发布时间:2019-06-26

本文共 5312 字,大约阅读时间需要 17 分钟。

封装:隐藏代码实现 复用 修改方便

继承:
多态:

面试是好解析面向对象

最好立即拿周围的事务来说
比如桌子
先分析类:桌子和椅子
他们都是家具
所以定义一个家具类 它是怎么材料 这个就是属性
它能做什么 这个就是方法 比如能坐 能放东西在上面

然后定义一个椅子类 它应该是家具 所以继承自家具类

它也有一个属性 它还有另外的属性 比如高度 等

我们把椅子封装到一个类里面 然后通过这个类 我们就可以

制作很多对象
比如椅子1号 椅子2号 然后我们再定义一个person类
它只要调用椅子的方法 就可以使用它的方法 我们无需
知道椅子内内部是如何实现的

因为所有椅子都有一个

--------------------------------------------

enum 星期{周日,周一,周二,周二......}

--------------------------------------------

internal 程序集里面访问public 引入命名空间就能访问private 类内部能访问protected 类内部和子类能访问

  

--------------------------------------------
this和构造方法

public Person(string name):this(50,name)//这里调用另外一个构造方法 并且年龄是默认50{}public Person(int age,string name){this.name = name;this.age = age;}

  

this在方法中使用 代表它所在的类在堆里面的对象

--------------------------------------------
命名空间 虚拟的文件夹系统

右击项目文件 属性 有个程序集名称 就是bin里面exe的名称

默认命名空间和项目一样 我们修改项目名 但默认命名空间没有变 要手动修改

输出类型 有程序集 和控制台应用程序

命名空间和程序集名称 本身没有什么相关

导入命名空间 using system.data;

写命名空间
namespace MySpace
{
class Person
{
}
}

在另一个命名空间里面 如果要想访问Person对象 那么要引入 using MySpace

这样 我们就可以 new Person对象 Person mai = new Person();
如果在另个命名空间里面有同名的类 那么我们访问的时候 就要 命名空间.类名

在同一个命名空间里面 可以创建多个类 比如

namespace MySpace{class Person{}Class Aminal{}}

  

同一个项目下面 每个cs命名空间默认是一样的

--------------------------------------------

new 子类时候 先创建子类对象 调用子类的构造函数(此时还没有执行子类构造函数方法体)
创建父类对象 调用父类构造函数 最后翻来执行子类的构造函数方法体代码

显示调用父类构造方法 base()

显示调用当前类的另外构造函数

public Person(string name):this(50,name)//这里调用另外一个构造方法 并且年龄是默认50{}public Person(int age,string name){this.name = name;this.age = age;}

  

--------------------------------------------

里氏替换原则-子类可以替换父类的位
父类 子类
Person p = new Student()
p.Say();//此时会调用父类类的say方法
但 如果父类没有say方法 那么会报错 因为父类的类型指针 只会找父类的的成员

如果我们想调用子类的 那么就要把p转换为student

student s = p as student;

当创建一个子类对象 声明的是父类对象 那么只能调用父类的方法

但当创建的子类对象 声明的子类对象 那么先看子类对象中是否有该方法 如果没有则调用父类的 如果父类也没有 则出错
--------------------------------------------
LSP里氏替换原则

不能将父类对象 强制转换为子类对象

子类 0 = (子类) new 父类() 这样是错的
除非你当前对象 本来就是一个子类
比如

Pserson p = new Student();Student s = (Student)c;s.Say();Pserson p = new Teacher();子类可以隐式转换为父类的Teacher t = (Teacher)p;父类可以强转成子类is 和astypeA is typeB 仅判断typeA as typeB 先判断,在转换

  

--------------------------------------------

简单工厂模式

static Person GetPerson(string typeStr){switch(typeStr){case "teacher":return new Teacher();case "Student":return new Student();default:return new Person();}}static void TestSimpleFactory(){Pserson p = GetPerson("Teacher");p.SayHi();}

  

-----------------------------------------------

多态 (方法重写)
三个条件
1.有继承关系
class Student:Person

 

2.子类方法重写父类方法

Person 中写一个虚方法 可以被子类重写

public virtual void SayHi(){consoloe.....}Student 中 重写该方法public override void SayHi(){dd...}

  

3.父类引用指向子类对象

Person p = new Student();
p.Say();//这时候 它真的会调用子类的方法
--------------------------------------------
AS IS

Person p = new Student();if(p is Student)//判断p是否是Student的子类或者就是Student{Student s = (Student)p;}如果用as Student s = p as Student;

  

--------------------------------------------

抽象类
抽象类里面可以有非抽象方法 

public abstract class AbstractClass{pulic void SayHi(){}public abstract void AbsMethod();//抽象方法}

  

abstract要写到class关键字外面

--------------------------------------------
abstract class Class1
{
public void Say()
{
Console.WriteLine("抽象类里面可以没有抽象方法");
}
}
//但抽象类不能new
--------------------------------------------
抽象类不能实例化(不能new)
抽象类可以有抽象方法 也可以没有
一般类不能有抽象方法
谁继承了抽象类 要么也写成抽象类 要么实现抽象类的所有抽象方法
--------------------------------------------
接口也是引用类型 类似类 和抽象类相似之处 三点
1、不能实例化
2、包括未实现的方法声明
3、子类必须实现未实现的方法
--------------------------------------------
接口的一些常见错误

private interface Interface1

{
}
错误 1 命名空间中定义的元素无法显式声明为 private、protected 或 protected internal
--------------------------------------------
interface Interface1
{
void Say();
}
错误 2 接口中的方法 不能有public修饰 private 等

--------------------------------------------

interface Interface1
{
void Say()
{
Console.WriteLine("接口中可以有方法实现???");
}
}
错误 3 “ConsoleApplication1.Interface1.Say()”: 接口成员不能有定义

--------------------------------------------

父类方法 如果没有标记位virtual
子类override这个方法 那么可能会错

namespace ConsoleApplication1{class Program{static void Main(string[] args){Person p = new Student();p.SayHi();Console.ReadKey();}}class Person{public void SayHi(){Console.WriteLine("person.sayhi");}}class Student:Person{public override void SayHi(){Console.WriteLine("student.sayHi");}}}

  

错误 1“ConsoleApplication1.Student.SayHi()”: 继承成员“ConsoleApplication1.Person.SayHi()”未标记为 virtual、abstract 或

override,无法进行重写

--------------------------------------------

虚方法 和抽象方法 区别
1、虚方法必须有实现 抽象方法 必须没有实现
2、抽象方法必须在抽象类中声明,虚方法可以出现在抽象类中
3、抽象方法必须在子类中重写,虚方法可以被重写

实现多态的主要手段

1 虚方法virtual
2 抽象方法abstract
3 接口

关于虚方法需要注意的几点

1 父类如果有方法需要让子类重写 则可以将该方法标记为virtual
2 虚方法在父类中必须实现,那片是空实现
3 虚方法子类可以重写override 也可以不重写
不重写 就没有多态 调用的时候 父类的指针类型则调用父类的 子类的指针类型则调用子类的

--------------------------------------------

new关键字 和overr visual

namespace ConsoleApplication1{class Program{static void Main(string[] args){Person p = new Student();p.SayHi();//由于子类重写了 所以调用子类对象 体现多态Person p1 = new Teacher();p1.SayHi();//直接调用父类的方法Teacher t = new Teacher();t.SayHi();//这里直接调用子类的 但如果子类方法没有new 则可能出现警告Console.ReadKey();}}class Person{public virtual void SayHi(){Console.WriteLine("person.sayhi");}}class Student:Person{public override void SayHi(){Console.WriteLine("student.sayHi");}}class Teacher:Person{public new void SayHi(){Console.WriteLine("teacher.sayhi");}//上面那里如果没有new 则会警告 new的作用是 隐藏父类的方法 因为父类也有同样的方法 而且是虚方法virtual//加个new的意思是 子类的这个方法 是子类新的方法 不是重写父类的方法}}

  

转载地址:http://xnego.baihongyu.com/

你可能感兴趣的文章
SCVMM 2012系列之一——安装部署
查看>>
zabbix通过skype发送报警消息之弯路
查看>>
我的友情链接
查看>>
Android开发
查看>>
jQuery stop()浅析
查看>>
我的友情链接
查看>>
spring cloud(第二部)服务注册与发现
查看>>
Azure IaaS云服务对应多个VIP
查看>>
SNMP协议
查看>>
CentOS下搭建SVN服务器
查看>>
Lync部署之Lync Mobile在Server上的设置
查看>>
Access字符串处理函数整理
查看>>
check_mk error 二 on centos
查看>>
2015年9月30日梳理重点的作业
查看>>
php数组排序
查看>>
Echart饼状图中心加固定文字及计算结果
查看>>
我的友情链接
查看>>
TCPIP协议号
查看>>
我的友情链接
查看>>
修改/etc/resolv.conf重启之后自动还原
查看>>