C#基础复习第一部

封装:隐藏代码实现 复用 修改方便
继承:
多态:

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

然后定义一个椅子类 它应该是家具 所以继承自家具类
它也有一个属性 它还有另外的属性 比如高度 等

我们把椅子封装到一个类里面 然后通过这个类 我们就可以
制作很多对象
比如椅子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 和as
typeA 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的意思是 子类的这个方法 是子类新的方法 不是重写父类的方法

}
}

  

原文地址:https://www.cnblogs.com/maijin/p/2689777.html