C# 面向对象

时间:2015-05-04 17:08:50   收藏:0   阅读:287

 

一,面向对象

(一),为什么需要面向对象

生活中所有的东西都是一个个的对象(万物皆对象),为了描述他们方便,我们就用面向对象的方法来解决

(二),什么是面向对象编程

根据具体的实际生活,设计相对应的类或对象出来,按照生活中的流程或逻辑来操作程序中的类或对象,这样更直观更方便。

(三),面向对象的三大特征

1,封装:封装的类=数据+对此数据所进行的操作(即算法)

2,继承:此特性可以将现实中的事物抽象为类,而且可以将事物之间的派生关系也一并模拟出来。它还是一个可以重用已有代码而不破坏已有代码的方法

3,多态:基类拥有的特性,子类一定有;但子类可以拥有基类没有的特性

二,类

(一)类的基本了解

类:根据实际情况定义的一种复杂的类型

包括两大部分:字段--成员变量(名词或形容词)  方法--成员函数(动词)

(二)类的定义

类的关键词:class

[public/private] class 类名
{
     [public/private] 变量类型 变量名;        //成员变量的定义;(字段的定义)
     public 属性类型 属性名     //属性的定义;
  {
      get{}
      set{}
   }
[public/private] 返回类型 函数名(形参列表)     //成员函数的定义;(方法的定义)

 }
}

在类的成员(成员变量,成员函数)前面经常会加访问修饰符(public private protected)

public:公有的,所有的类都可以访问

private:私有的,只有在本类中才可被访问

protected:受保护的,只有在子类中才可被调用

类的封装:不要随便把成员变量设成public,一般需要设成private或protected,通成员方法或成员属性来实现对成员变量的合法访问。

(三)类的使用:
类的实例化 - 生成对象。
类名 引用名 = new 类名();

调用对象的成员:
引用名.成员变量名
引用名.属性名
引用名.成员方法名()

例如:Dog d=new Dog();

d.Name = "旺财";
d.Owner = "张三";
d.Run();

(四)附加

C#中的变量的类型:
1、值类型:
int float double char bool struct datetime
2、引用类型:
string  数组  自定义的类。


模型图:堆空间:所有值类型的变量都是在栈空间中分配的

栈空间:所有引用类型变量所引用的对象,其内存都是在堆空间中分配的
用模型图解释:
A a1 = new A();
A a2 = new A();
Console.WriteLine(a1== a2); //结果为什么是false?技术分享

三,类的成员--属性:对成员变量进行访问的端口,用来给私有的成员变量进行安全的赋值取值

(一)定义:
public 属性类型 属性名
{
  get //读取部份。
{
  return 成员变量名.
}
set //设置部份
{
  成员变量名 = value;
}
}
public int Height
{
  get
  {
    return _Height;
  }
  set
  {
    if(value>0 && value<300)
      {
    _Height = value;
      }
      else
     {
    Console.WriteLine("Error");
     }
  }
}

(二)属性的使用

Console.WriteLine(r.Height); - 调用属性的get部分
r.Height = 180; -属性在等号的左边则调用属性的set部分。

四,类的方法——成员函数——方法重载

方法名相同,参数不同(参数类型不同,参数个数不同)——形成了方法的重载

重载的好处:方法命名和记忆方便了;提高代码重用性,减少重复,代码结构更合理

多个重载方法被调用的时候,首先找方法名,然后再根据参数找对应的重载方法。

五,构造函数:对象在实例化的时候自动被调用的函数。无法使用代码显式调用当前对象的构造函数。

通常在构造函数中用来对对象进行初始化的工作(给成员变量赋初始值)

定义

[public/private] 类名()


特点:1,对象在实例化的时候被自动调用;

    2,它是最早被调用的成员函数。    new 类名()——其实就是对构造函数的调用

       3,构造函数可以重载

如何调用同一个类中的其它的构造函数?

class ChiBang

{

  public string _Type;

  public string _Count;

}

class FeiXingQi

{

public FeiXingQi(string name)
{
  Name = name;
}
public FeiXingQi(string name,int count,string type):this(name)
{
  _ChiBang = new ChiBang();
  _ChiBang._Type = type;
  _ChiBang._Count = count;
}

}

this代表的当前的对象。this()调用当前对象的其它构造函数。this.xxxx调用当前对象的其它成员。
注意:调用其它构造函数的this() ,不要写在构造函数的{}里面。写在构造函数的声明后面。

4.如果不显式声明构造函数,系统会自动加一个默认的构造函数。一旦显式声明构造函数了,系统将不会再自动生成默认构造函数。

六,静态成员

在面向对象的程序中,对类的实例和静态成员,有以下的访问规则:

1,位于同一类中的实例方法可直接相互调用

2,类的字段(包括实例字段和静态字段)可以被同一类中的所有实例方法直接访问

3,类中的静态方法只能直接访问类静态字段(要想在静态方法中访问实例数据,可通过实例化出该对象即可)

 注意:静态成员是属于类的,不管我们造多少个对象,静态成员在内存中永远只是占一个区域

         实例成员是属于对象的,每个对象都会有对应实例成员的存储区域

调用实例成员:对象名.实例成员名

调用静态成员:类名.静态成员名

 ******注意:静态方法中只能调用静态的成员。实例方法可以调用实例成员也可以调用静态成员。

 七,继承

(一)什么是继承

1,父类中的相关成员会自动派生到子类中去

 2,子类可以扩展父类的相关成员

 3,子类可以代替父类来使用,但是父类不能代替子类来使用

 (二)继承的语法

class 子类:父类

{

}

(三)继承的法则

1,成员变量的继承

(1)可定义为public或者是protected,则子类都可以访问

(2)如果同名则隐藏。子类与父类各自用各自的成员

2,属性的继承

(1)属性一般只用public来修饰

(2)如果同名则隐藏。子类与父类各自用各自的成员

 3,方法的继承

(1)可定义为public或者是protected,则子类都可以访问

(2)如果同名则隐藏。子类与父类各自用各自的成员

(3)重写:I,把父类的方法设为虚方法,virtual——这代表此父类方法可以被重写

      II,在子类中用override来重写父类的方法——子类确认要重写

注意: I.如果父类方法中没有声明virtual,子类中有override重写它,会报错。

II.如果父类中声明了virtual,子类中没有override去重写它,不会报名,但会被隐藏。

III.虚方法一虚到底。子类即使override父类的虚方法,子类的这个方法依然还是虚方法。子类的子类还可以override该虚方法

4,构造函数的继承

(1)如果父类没有写构造函数,或者父类构造函数没有参数,则子类的构造函数没有特殊要求。

(2)如果父类的构造函数都有参数,子类构造函数必须向父类构造函数中传递值。base();

注:在子类中调用父类的方法时,可以使用base.xxxx来调用。一般用调用父类被重写的方法。

 

八,多态:主要是在继承的基础上实现出来的

 1,多态的分类:

(1)静态多态(编译多态):是用方法的重载来实现的

(2)动态多态(运行多态):是用继承和重写来实现的

 2,抽象类:对事物进行高度的抽象,抽象到一定程度,无法去具体描述。抽象类是无法被实例化的类,不能被new出来

抽象方法:只有方法的声明,没有方法的实现。即只有函数名,输入形参,返回类型,没有函数体(关键词abstract)

抽象类与抽象方法的关系:
(1)含有抽象方法的类一定是抽象类
(2)抽象类不一定包括抽象方法。

遇到抽象类一般有两种处理思路:(1)找到该抽象类的派生类,使用其派生类(2)自己继承此抽象类,实现其派生类

对于抽象方法,子类也必须使用override来实现父类中的抽象方法。

原文:http://www.cnblogs.com/William-1234/p/4476291.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!