一:面向对象的基本知识

C#程序分为面向过程和面向对象

什么是对象:一切皆为对象:Object,生活中常说的“东西”就是程序里面所指的对象;生活中遇到的东西我们都在下意识的归类;归类意味着抽象模型;

类:class,对某类众多对象的共同特点抽象出来的模型。

他们的关系:类是好多对象的抽象,对象是类的实例化。

创建一个名为Dog的类:

 class Dog  //一般首字母大写
{
int age;
public void setage(int a) //用方法赋值
{
age = a;
}
public void buck()
{
Console.WriteLine("这是一个方法");
}
}

类中一般包括两类东西,变量(名词,也交成员变量这里age是成员变量)和函数(动词,也叫成员函数或成员方法 buck()就是方法)。

对象实例化:

Dog d1 = new Dog();

这样就实例化出了一个Dog的对象a。

例子:两个套在一起的圆,求内圆的周长和内圆与外圆之间的面积,用面向对象的思想做

class circle
{
float r;
public circle(float a)
{
r = a;
}
public double zhouchang()
{
return * 3.14 * r;
}
public double mianji()
{
return 3.14 * r * r;
}
}
class Program
{
static void Main(string[] args)
{
circle m = new circle();
circle n = new circle();
double bc = m.zhouchang();
double mj = (n.mianji()-m.mianji());
Console.WriteLine("内圆的周长为:"+bc);
Console.WriteLine("花砖的面积为:"+mj);
}
}

首先做了一个名为circle的类,它可以生产任何一个半径不同的圆,在构造函数中,为半径赋值。

二:面向对象的三大特性

三大特性是指:封装,继承,多态。

类中的方法一般分为:构造方法(函数);属性方法(函数):成员变量赋值取值;行为方法(函数):变量运算。

(一): 封装

1.封装含义:

(1)不同类的变量只属于各自的类。

(2)不同对象的成员变量只属于各自的对象,彼此不受影响。

(3)对象中的变量需要通过方法(函数)实现操作,比较安全。

封装为了安全,尽量不用public来声明变量,避免在main函数中可以直接访问赋值而降低了安全性,在类中建立public的方法来赋值,main中调用此方法传值。

2. 成员变量及访问修饰

private 私有成员 ,protected 受保护的成员,public 公有成员

3. 构造函数

它是一个特殊的成员函数,一般在构造函数里进行初始化。如果不写构造函数在new的时候会自动生成一个默认空的构造函数。

写法特殊:没有返回值,函数名只能与类名一样;public 类名(){};

执行特殊:类在实例化(new出来的时候)自动执行,构造函数是最早执行的成员函数,构造函数是用来生成对象的函数。

它的主要作用:对象实例化生成的时候,做一些初始化的工作。

下面例子就是做了一个Ren()的构造函数,为其变量赋上初始化的值:

 class Ren
{
string _Name;
int _Age; public Ren()
{
_Name = "龙神";
_Age = ;
}
}

4. 重载(函数或方法)

函数名相同,参数不同(参数个数或类型不同)的多个函数就形成了重载。

重载只与函数名和形参有关,与返回类型无关。

下面举个例子,构造函数的重载:

    class Ren()
{
string _Name;
int _Age; public Ren()
{
_Name = "ZSMJ";
_Age = ;
}
public Ren(string name)
{
_Name = name;
}
public Ren(string name,int age)
{
_Name = name;
_Age = age;
}
}

这样Ren类中就做了三个构造函数,第一个是无参的,第二个是一个string类型的参数,第三个是两个参数,类型分别为string和int。他们符合重载的条件,所以会形成重载在Main函数中new的时候根据参数的不同会自动选择执行其中一个构造函数。

如果在Main函数中:

Ren a = new Ren("王大锤");

则执行的构造函数是第二个。

5.  属性

它的声明:public 类型 属性名;也可以选择成员变量右键重构,封装字段来生成属性方法,例如:

    string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}

这样Name就是该类的一个属性,在Main函数中可以用此属性为其成员变量赋值取值:

     Ren a = new Ren("王大锤");
a.Name = "王尼玛";

注意:(1)属性是用来为成员变量赋值和取值的,它有代替属性方法的作用,一般用属性。

(2)属性定义的时候,属性名后面没有小括号。

(3)属性都是public。

(4)属性中只能包含两个部分:get和set。代码也只能写在get和set的花括号里面。

(5)属性分为只读属性,只写属性和可读写属性,与get和set的有无有关系。

6. this关键字

概念:this引用,this在哪个对象里面执行代表该对象本身。

用法:this.成员变量(成员方法),this._Name; this.Eat();

例子:this 调用当前对象的其它构造函数。

  public class Mydate
{
int _Year;
int _Month;
int _Day;
int _Hours; public Mydate(int year,int month)
{
_Year = year;
_Month = month;
}
public Mydate(int year,int month,int day,int hours): this(year,month)
{
_Day = day;
_Hours = hours;
}
}

这里第一个构造函数中有两个参数year和month,在做第二个构造函数的时候为了方便用“:this”来调用了本类中第一个构造函数,这样第二个构造函数只需写后day和hours的执行语句就可以了。

在new的时候传入不同的参数,会实例出不同的对象,这时候的this就代表不同的对象。

7. is关键字(运算符)

用法:对象 is 类名;is左边是对象,右边是类型;

 Console.WriteLine(a is Ren);

如果a是一个Ren类的对象,则返回值为true,否则返回值为false。

8. partial关键字

如果一个类特别大,不宜挡在一个文件中实现或者一个类中有一部分代码不宜与其他混淆或者需要多人合作编写一个类,这就需要将一个类拆开来写。

用partial关键字可以实现,也可以用来补充完善类,扩展性比较强。
 
如在程序集里的一个文件里写了 partial class Ren{里面是成员} ; 在另一个文件里也可以对Ren类进行补充,需要这样写 partial class Ren{里面是成员} 。
 
9. 静态成员

非静态变量称为实例变量,非静态方法称为实例方法,实例成员的数据存在每个对象中,用对象名来调用。

静态成员包括:静态变量,静态属性,静态方法。

定义一个成员为静态的:在变量或方法前加static,如:static int a;

静态变量是属于类的,每个对象都有的并且相同的东西只保存一份,不和实例变量那样在每个对象里都面保存一份。

可以说它不属于任何对象,也可以说它又属于任何一个对象,给每个对象用,节省空间。

例如:每包粉笔的颜色是静态成员,每支粉笔的剩余长度是实例成员。

静态变量或方法不需要new出来。

在C#中,定义了一个粉笔的类:

   class Fenbi
{
static string _Color; public static string Color
{
get { return Fenbi._Color; }
set { Fenbi._Color = value; }
}
int _Lenght; public int Lenght
{
get { return _Lenght; }
set { _Lenght = value; }
}
}

(1)在当前类的花括号外,静态成员只能用类名来调用,不能用对象名来调用,而实例成员只能用对象名来调用,不能用类名来调用。

      Fenbi.Color ="Yellow";
Fenbi b = new Fenbi();
b.Lenght = ;

(2)在当前类的花括号内,静态方法只能直接调用静态成员,不能调用非静态成员,实例方法可以调用非静态和静态的成员。

     public static void xiezi()
{
Console.WriteLine("写出"+_Color+"的文字了");
}
     public void change()
{
Console.WriteLine(_Color+"的粉笔长度变为:"+_Lenght);
}

10.  拷贝

浅拷贝:传递引用,不赋值对象。
深拷贝:创建一个新的对象。

(二): 继承

1. 语法:public 子类名:父类名;如:class Dog:Pet。

2. 特点:单继承,一个父类可以派生多个子类,但每个子类只能有一个父类

如果一个类,没有明确指定父类是谁,默认是object。除了object类之外,所有类都有一个父类。

子类可以从父类继承下父类的成员变量和成员方法。

3. 访问修饰符合访问权限:

private 的成员不被继承,只能在该类中访问。

protected成员可以被继承,能在该类和派生类中访问到,在外界访问不到。父类中的变量一般用protected。

public成员可以被继承,能在所有地方访问到。

4. base 关键字:子类中可以用(base.父类中的成员 )来调用父类中的成员,base()调用父类构造,base.xxx()调用父类成员方法。

调用的参数值会被覆盖,方法也会被覆盖。

5. 继承关系中实例化子类的流程:

先执行父类的构造函数,再执行子类的构造函数。

6. 继承关系的实例化:

如果父类的构造函数没有空参构造函数,全是带参数的,则子类必须要写构造函数,构造函数的形参中必须包含父类构造函数所需要的参数,还要用base()把父类构造函数所需要的参数传递父类。

例如:父类中只有这个构造函数

      public Ren(string name, int age)
{
_Name = name;
_Age = age;
}

那么子类中的构造函数应该这样写:

      public Chinese(string name, int age, string yuyan):base(name,age)
{
_Yuyan = yuyan;
}

7. sealed 关键字:

如果用来修饰class,称为密封类,此类无法被继承;如果用来修饰方法,该方法无法被重写。

如: sealed class Ren{};

(三): 多态

1. 概念:父类引用指向不同子类实例的时候,父类引用所调用的函数都是子类的函数,由于子类对象不同,父类引用调用的成员表现出来的不同状态就是一种多态。

2. 实现的方式:多态需要通过继承来实现

3. 分类:分为编译多态(重载overload)和运行多态(重写override)。父类方法被重写了之后也可以在子类中用base.方法 调用。

4. virtual关键字:虚方法,允不允许重写,要重写父类方法必须是虚方法:public virtual void Eat()。

5. 运行多态实现的条件:

(1)子类对父类方法的重写(override),父类和子类中都有相同的方法。

(2)父类引用指向子类实例。

例如,有一个Ren类是父类,一个Chinese类和American是子类,Ren r = new Chinese();父类的引用 r 指向子类实例。

    class Ren
{
protected string _Name;
protected string _Country;
public virtual void Eat()
{
Console.WriteLine("正在吃饭...");
}
}
class American : Ren
{
public override void Eat()
{
Console.WriteLine("正在用叉子和刀子吃饭....");
}
}
class Chinese : Ren
{
public override void Eat()
{
Console.WriteLine("正在用筷子吃饭...");
}
}

父类Ren中有个Eat方法为虚方法,在子类Chinese和American中进行了重写,在Main函数中:

    Random rand = new Random();
int n = rand.Next();
Ren a;
if (n % == )
{
a = new American();
}
else
{
a = new Chinese();
}
a.Eat();

随机让父类引用 a 指向 不同的子类实例,这样用父类引用 a 调用方法Eat()的时候表现出不同对象的操作。

6. 里氏代换原则和抽象依赖原则

里氏代换原则,如果某个方法接收的是父类引用,可以向里面传父类或其子类的元素,子类对象替代父类对象。

抽象依赖原则,用父类的引用来指向子类的实例。

例子:怪兽吃人,传入Ren的引用 r ,则r.Cry()表现出来不同的结果。

class Monster
{
public void EatFood(Ren r) //r = a;
{
r.Cry();
Console.WriteLine("人类真好吃,吃饱了!");
}
}
class Ren
{
public virtual void Cry()
{
Console.WriteLine(".......");
}
}
class American:Ren
{ public override void Cry()
{
Console.WriteLine("MyGod,God bless me!");
}
}
class Chinese:Ren
{
public override void Cry()
{
Console.WriteLine("天哪,老天爷保佑我!");
}
}

在Main函数中 ,先实例出一个怪兽,随机生成一个Ren的对象,将此对象的引用传入怪兽类里,通过这个引用来表现出不同的状态。

            Monster m = new Monster();
Random rand = new Random();
int n = rand.Next();
if (n % == )
{
American a = new American();
//或者是这样写 Ren a = new American(); m.EatFood(a);
}
else
{
Chinese c = new Chinese();
//或者是这样写 Ren c = new Chinese(); m.EatFood(c);
}

C#面向对象(一)的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  3. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  4. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  5. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

  6. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  7. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  8. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  10. .NET基础拾遗(2)面向对象的实现和异常的处理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. [wikioi]石子归并

    http://wikioi.com/problem/1048/ 区间型动态规划.参考PPT:http://wenku.baidu.com/view/73c1ded5b9f3f90f76c61bc4.h ...

  2. 【踩坑记】从HybridApp到ReactNative

    前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...

  3. BASH小脚本

    1.查找当前目录中所有大于500M的文件,把这些文件名写到一个文本文件中,并统计其个数. find ./ -size +500M -type f | tee file_list | wc -l 2.在 ...

  4. JDBC_demo:java连接mysql过程

    1.任何数据库驱动程序都提供对java.sql.Driver接口的驱动类,mysql-connector-java-5.1.39-bin.jar中Driver: package com.mysql.j ...

  5. 微信小程序资料集合

    一:官方地址集合: 1:官方工具:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1476434678461 2: ...

  6. Zend Framework 2参考Zend\Authentication(摘要式身份验证)

    Zend Framework 2参考Zend\Authentication(摘要式身份验证) 介绍 摘要式身份验证是HTTP身份验证的方法,提高了基本身份验证时提供的方式进行身份验证,而无需在网络上以 ...

  7. 【JAVA - SSM】之MyBatis输出映射

    MyBatis中的输出映射有两种:resultType和resultMap. 1.resultType 使用resultType进行结果映射时,只有当查询结果中有至少一列的名称和resultType指 ...

  8. 验证码 jsp生成

    <%@ page contentType="image/jpeg" import="java.awt.*, java.awt.image.*,java.util.* ...

  9. 【转】YUV420P的格式以及转换为RGB565的代码(Android摄像头的输出一般为YUV420P)

    http://blog.csdn.net/daisyhd/article/details/38866809 static void cvt_420p_to_rgb565(int width, int  ...

  10. 我的第一个 Rails 站点:极简优雅的笔记工具-Raysnote

    出于公司开发需求,这个暑假我開始搞Ruby on Rails.在业余时间捣鼓了一个在线笔记应用:http://raysnote.com.这是一个极简而优雅的笔记站点(至少我个人这么觉得的). 笔记支持 ...