1、面向对象基础

软件开发总是满足于需求的,需求变化,软件也要跟着变。使用设计模式可以大大增强以有代码的复用性。好处有于易扩展、易复用、易维护、灵活性好。

面向对象基本概念
1、对象是一个自包含的实体,用一组可识别的特性和行为来标识。面向对象编程,也叫Object-Oriented Programming.
如果要使功能复用,首先想到的是编写一函数。但是如果要更广范围内的利用,那就应该定义类,将功能定义成为公有的函数。
如下创建了一个名为Student的学生类。
class Student
{
  public string Introduce()
  {
    return "Hello";
  }
}
实例就是一个真实的对象,而类的实例化就是创建对象的过程,使用new关键字来创建。
  Student student=new Student();等价于Student student; student=new Student();那么实例化就相当于创造了一个学生,在任何需要学生

学习的地方都可以实例化它。比调用函数方便多了。
  student.Study();
2、构造方法是对类进行初始化,构造方法与类同名,无返回值,也不需要void,在new 的时候调用。
所有类都有构建方法,如果你不编码,系统默认生成空的构造方法,若有自定义的构造方法,那么默认的构造方法就失效了。如
 class Student
 {
   private string name=""; //声明一个Student类的私有字符串变量name;
   public Student(string name) //定义了一个构造方法,参数是输入一个字符串
    {
      this.name=name;
    }
   public string Introduce()
    {
      return "Hello";
    }
 }
  在客户端要创建一个学生的的时候,就必须给生起名字了。如 Student student =new Student("李雷");
3、方法重载提供了一个创建同名的多个方法的能力,但这些方法需使用不同的参数类型。这里不涉及到返回值,返回值类型可以相同,也可以

不同,不作为判断方法是否相同的依据。
方法重载可以在不改变原方法的基础上,新增功能。构造方法也可以重载。
class Student
 {
   private string name=""; //声明一个Student类的私有字符串变量name;
   public Student(string name) //定义了一个构造方法,参数是输入一个字符串
    {
      this.name=name;
    }
   public Student() //定义了一个构造方法,参数是输入一个字符串
    {
      this.name="无名";
    }
   public string Introduce()
    {
      return "Hello";
    }
 4、字段与属性 字段是存储类满足其设计所需要的数据,字段是与类相关的变量,通常字段是private类型,即私有变量,只允许同一个类中

的成员访问,字段一般用小写字母或下划线开头表示,如private string name,private string _name。
属性实质上是一对方法(get ,set),但在调用它的代码看来,它是一个字段,即属性适合于以字段的方式使用方法调用的场合。属性都是

public类型,即公有变量,允许其他作何类来访问。属性一般首字母大写 如public int Number 可在属性内部可以作逻辑判断。
5、封装 每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此,对象不必依赖其它对象来完成自己的工作。封装的好处

有:良好的封装能减少耦合,类内部实现可以自由的修改。类具有清晰的对外接口。
5、继承 对象的继承代表了一种‘is-a'在关系,如果两个对象A和B,可以描述为B is a A ,则表明B可以继承A。继承者可以理解为被继承者的

特殊化,因为它除了具备被继承者的特性外,还具备自己特殊的个性。如果子类继承父类,1、子类拥有父类非private的属性和功能,public

和protected。用protected修饰的类成员,对于子类公开,但不对其它类公开。但对于构造方法,不能被继承,只能被调用,可以用base关键

字。2、子类具有自己的功能,即子类可以扩展父类没有的属性和功能。3、子类可以以自己的方式实现父类的功能(方法覆写)。
不用继承的话,如果要修改功能,就必须在所有重复的方法中修改,代码越多,出错的可能性就越大,而继承的优点是所有子类公共部分都放

在了父类,使得代码得到了共享,避免了重复。继承可使修改和扩展继承而来的实现都较为容易。继承的缺点是父类变,子类也就跟着变,继

承会破坏包装,父类的实现细节暴露给子类,增大了两个类之间的耦合性。c#中只允许单继承,即一个子类只能有一个父类。而不允许多继承


6、多态表示不同对象可以执行相同的操作,但要通过自己的实现代码来执行。多态的原理是当方法被调用时,无论对象是否被转换其父类,都

只有位于对象继承链末端的方法实现会被调用。也就是说虚方法是按照其运行时类型而非编译时的类型进行动态绑定调用的。
为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的,这是通过在该成员的返回类型前添加virtual关键字。但是虚

文必须要有方法体。然后,子类可以选择使用override关键字,将父类中的实现替换为自己的实现,这就是方法覆定override.
父类public virtual string Read(){return "";}子类public override string Read(){return "你好";}
7、重构 就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的

扩展性和维护性。如果子类中有相同的方法代码,请把它上升到父类,只是将子类不同的部分采用虚方法。如果同一个类中有相同的代码块,

请把它提炼成类的一个独立方法,如果不同类中具有相同的代码,请把它提炼成一个新类,永远不要重复代码。当看到一个过长的方法时,需

要想办法将其划分为多个小方法。
8、抽象类  在C#允许把类的方法声明为abstract,即抽象类和抽象方法。
abstract class Person
{
  ...............
  protected abstract string Read();//方法没有方法体,直接在括号后面加;
}
抽象类的特点:1、抽象类不能实例化。2、抽象方法必须是被子类写的方法 。3、如果类中包含抽象方法,那么就必须定义为抽象类,不论是

否还包含其他一般方法。抽象类通常代表一个抽象的概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的。所以,

在一个继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类。 抽象类应该拥有尽可能多的共同代码,拥有尽可

能少的数据。
9、接口(interface) 接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合,一旦类实现了接口,类就可以支持接口所指定的所

有属性和成员。声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。接口不能被实例化,不能有构造方法和

字段,不能有修饰符。实现接口的类中就必须要实现接口中的所有方法和属性。一个类可以支持多个接口,多个类也可以有相同的接口。
interface IGet
{
 string GetThing(string thing)
}
class Men:Person,IGet //男人继承于猫,并实现IChange接口。
{
   public string Get(string thing)
   {return thing;}
}
调用的时候将子类对象赋给接口变量,然后用接口对象的方法来实现调用。
接口和抽象类的区别:1、抽象类中可以给出一些成员(非抽象方法)的实现,接口却不包含成员的实现,抽象类的抽象成员可被子类部分实现

实现,而接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但可实现多个接口。 类是对对象的抽象,抽象类是对类的抽象,接口

是对行为的抽象。如果行为跨越不同类的对象,可使用接口,对于一些相似的类对象,对继承抽象类。

原文地址:https://www.cnblogs.com/liuyuanhao/p/3070644.html