C#编程利器之一:类(Class)

    面向对象的程序设计(Object-Oriented Programming,简记为OOP)是一种功能非常强大的编程方法,立意于创建软件重用代码,以类为基础去思考编程问题。类是OOP中的核心组成元素,通常都是使用类来“封装”对象(属性、行为)。在经典图书《代码大全》里定义:“创建高质量的类,第一步,可能也是最重要的一步,就是创建一个好的接口。这也包括了创建一个可以通过接口来展现的合理的抽象,并确保细节仍被隐藏在抽象背后。”,其实接口也是一个类,一个更为抽象的类.

    在我以前的一篇文章里曾经提到:面向对象编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。----选自《大话设计模式》” 。

      可见,在OOP中,类是何等的重要,本文将以类作为谈论点,全方面的分析和介绍类的各种相关知识点。

 

一. 日常生活中的对象

     在大多数人眼里,对象是一个抽象的名词,而类呢则更为抽象。日常生活中,可以把对象理解为可辩识的一种实体。如汽车、轮船、飞机、电脑等。如果把对象和程序联系起来,则可看作是在程序中表示的一个实体。

      一切从现实出发,才能使编写出的代码更能反映出真实的生活。如电脑这个对象,则包括有主板,硬盘,显卡,内存等组成元素。然而实际的编程中并不是这么的简单,但是我们还是得从现实中去分析。以这种方式去考虑程序的设计,就会得到很多的好处:程序更容易设计,程序的体系结构更直观,更容易理解,更清晰的反映了程序从真实生活中抽象出来的含义,更便于多个开发人员一起工作,因为他们可以在代码中处理不同的对象,只需要知道其他人的对象做什么工作,无需担心其他人的代码的工作细节。

 

二. 编程中的对象

     我们平时在编程中用到过些什么对象呢?我想无外乎是两大类:系统对象和用户自定义对象。OK, 为了更清楚的说明这点,我们从“Hello World”开始吧。看看如下代码定义:

Console.WriteLine( " Hello Wrold " );

     上面这句代码对于正在看本文的你来说,我想应该是在熟悉不过了.他的功能就是将“Hello World”这个字符串在控制台输出.然而,出此之外,这句代码还隐含着其他的相关知识.那么具体是什么呢?其实我们在编写这句代码的时候已经使用对象了.Console就是一个对象,.NET Framework提供的一个系统对象,我们之所以能够通过WriteLine方法实现输出,是因为我们调用了这个系统对象的方法. 这里Console就是一个典型的系统对象.

 

     下面我们来看看什么的自定义对象,首先我们来分析一下现实生活中的对象.以电脑来说,一台电脑大概由主板,硬盘,显卡,内存等众多元素组成.通过抽象,我们就可以认为电脑就是一个对象,主板,显卡这些组成元素则是电脑这个对象的属性.下面是电脑类的定义:

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
 2/// 电脑类
 3/// </summary>

 4 public   class  Computer
 5 ExpandedBlockStart.gifContractedBlock.gif {
 6    private string name;
 7    public string Name
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 9ExpandedSubBlockStart.gifContractedSubBlock.gif        get return name; }
10ExpandedSubBlockStart.gifContractedSubBlock.gif        set { name = value; }
11    }

12
13    public string 主板 = "精英主板";
14    public string 硬盘 = "希捷硬盘";
15    public string 内存 = "金士顿";
16    public string 显卡 = "七彩红";
17    //其他组成元素
18
19    public Computer()
20ExpandedSubBlockStart.gifContractedSubBlock.gif    { }
21
22    public Computer(string name)
23ExpandedSubBlockStart.gifContractedSubBlock.gif    {
24        this.Name = name;
25    }

26}
     上面这段代码说明什么呢?我们定义了一个Computer类,类里定义了几个成员,还有构造方法等.为了更清晰的说明这样做的目的,我们可以先来做个测试.建立两个对象,然后判断他门的属性是不是同一个.代码如下:
 1 class  Program
 2 ExpandedBlockStart.gifContractedBlock.gif {
 3    static void Main(string[] args)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 5        Computer zhangsan = new Computer("张三");
 6        Computer lisi = new Computer("李四");
 7
 8        Console.WriteLine(zhangsan.主板 == lisi.主板);
 9    }

10}

      通过运行上面程序段,结果为:true.这说明什么,说明张三的主板和李四的主板是同一个吗?不是,我们应该说张三和李四都是使用的同一个类的对象.这里Computer类到底做了什么呢?封装属性和行为吗?最容易的理解便是把这个类看作是一种新的数据类型.也就是说Computer是一种数据类型,而zhangsan和lisi则是这种新数据类型的变量,用OOP的话来说的话,zhangsan和lisi则是Computer这个对象的实例或是对象.

 

三、类的相关特性

     类的特性有很多,这里我就简单的介绍下最常用的几个特性。

    1. 类名

     类名是唯一一个用于区分其他类的特性,如同人的名字一样。当然在同一个项目或是程序集或是框架中,会出现同名的类,就如同世界之大,名字相同的人到处都有一样。而现实生活中的同名人可以根据他所在的国家、省份、区县、乡村以及家庭来区分,对于同名的类呢则是通过命名空间来区分的。

      如上电脑类Computer,Computer就是电脑类的类名,用这个名字类区分其他类。

 

    2. 属性

      属性是一个类的重要组成部分,就以上面的电脑类(Computer)来说吧。name,主板,显卡等都是Computer类的属性。我们可以通过类对象(实例对象)去访问他们,示意性代码如下:

 1 class  Computer
 2 ExpandedBlockStart.gifContractedBlock.gif {
 3    public string Name = "张三";
 4}

 5 class  TestComputer
 6 ExpandedBlockStart.gifContractedBlock.gif {
 7    void Method()
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 9        Computer computer = new Computer();
10        Console.WriteLine(computer.Name);
11    }

12}

      在实际的开发中,我们通常将属性设置为private的,通过对外提供get;set;属性访问器供外部调用,关于这点这里就不作详细介绍。

 

    3. 构造方法

      构造方法是用得最多的一个特性,与普通的方法相比不同的是构造方法无返回值修饰符,每当你要创建一个对象实际上就是在调用给对象的构造方法。实际开发中,我们可以多次重载构造方法,以及通过构造方法来初始化属性的值。示意性代码如下:

 

 1 class  Computer
 2 ExpandedBlockStart.gifContractedBlock.gif {
 3ExpandedSubBlockStart.gifContractedSubBlock.gif    public Computer() { }  //无参构造方法
 4    public Computer(string name)  //重载构造方法,带一个参数
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 6        this.Name = name;
 7    }

 8
 9    private string name;
10    public string Name
11ExpandedSubBlockStart.gifContractedSubBlock.gif    {
12ExpandedSubBlockStart.gifContractedSubBlock.gif        get return name; }
13ExpandedSubBlockStart.gifContractedSubBlock.gif        set { name = value; }
14    }

15}

16 class  TestComputer
17 ExpandedBlockStart.gifContractedBlock.gif {
18    void Method()
19ExpandedSubBlockStart.gifContractedSubBlock.gif    {
20        Computer computer = new Computer(); //调用无参构造方法
21        computer.Name = "张三"// 通过属性访问器设置属性的值
22        Console.WriteLine(computer.Name);  //调用重载的带参数构造方法
23        computer = new Computer("张三"); //通过构造方法设置属性的值
24        Console.WriteLine(computer.Name);
25    }

26}

 

   4. 行为(方法)

      这点很容易理解,类的行为也就是类的方法,如上面类构造方法里的程序代码,在TestComputer类里就有一个方法Method,我们可以称为是TestComputer类的行为或是方法。

 

   5. 类对象(实例)

      这里也很容易理解,在之前我们已经使用了多次类的对象了。如TestComputer类的Method方法里,就创建了Computer类型的类对象computer,通过此对象,我们可以很方便的访问Computer类里公开的属性和方法,示意代码如下:

1 public   void  Method()
2 ExpandedBlockStart.gifContractedBlock.gif {
3    //创建一Computer类型的对象computer
4    Computer computer = new Computer("张三");
5    string name = computer.Name; //通过对象computer去调用Computer类的属性Name
6}

 

   6. 类继承

     由于C#是单继承语言,因此在类的继承上只支持单一继承,也就是说一个类只能有一个父类,但是可以继承多个接口。

1 class  A
2 ExpandedBlockStart.gifContractedBlock.gif {
3ExpandedSubBlockStart.gifContractedSubBlock.gif    public string Name getset; };
4}

5 class  B:A   // 类B继承于类A
6 ExpandedBlockStart.gifContractedBlock.gif {
7
8}

 

 1 class  A
 2 ExpandedBlockStart.gifContractedBlock.gif {
 3ExpandedSubBlockStart.gifContractedSubBlock.gif    public string Name getset; };
 4}
 5 interface  Ia
 6 ExpandedBlockStart.gifContractedBlock.gif {
 7    void MethodA();
 8}

 9 class  B:A,Ia   // 类B继承于类A,同时继承于Ia接口
10 ExpandedBlockStart.gifContractedBlock.gif {
11    public void  MethodA()
12ExpandedSubBlockStart.gifContractedSubBlock.gif    {
13         //
14    }

15}

 

 1 class  A
 2 ExpandedBlockStart.gifContractedBlock.gif {
 3ExpandedSubBlockStart.gifContractedSubBlock.gif    public string Name getset; };
 4}
 5 interface  Ia
 6 ExpandedBlockStart.gifContractedBlock.gif {
 7    void MethodA();
 8}
 9 interface  Ib
10 ExpandedBlockStart.gifContractedBlock.gif {
11    void MethodB();
12}

13 class  B:A,Ia,Ib   // 类B继承于类A,同时继承了Ia,Ib接口
14 ExpandedBlockStart.gifContractedBlock.gif {
15    public void  MethodA()
16ExpandedSubBlockStart.gifContractedSubBlock.gif    {
17         //
18    }

19
20    public void  MethodB()
21ExpandedSubBlockStart.gifContractedSubBlock.gif    {
22         //..
23    }

24}

 

   7. 类修饰

     关于类修饰这里就不做详细介绍,只是简单的提出几个概念。详细请查阅相关资料了解更多。下面是几种常见的类修饰:

1 ExpandedBlockStart.gif ContractedBlock.gif public   class  ClassName  { }
2 ExpandedBlockStart.gifContractedBlock.gif public   static   class  ClassName  { }
3 ExpandedBlockStart.gifContractedBlock.gif public   sealed   class  ClassName  { }
4 ExpandedBlockStart.gifContractedBlock.gif public   partial   class  ClassName  { }

 

     本文介绍了与类相关的常用知识点,当然类还有很多的知识点本文里没有提出,要更详细的了解类请查阅相关书籍和资料,篇幅限制,本文就介绍于此,希望本文对新手有所帮助。个人能力有限,文中难免会出错,还望大家勇言提出,谢谢。

 

注:转载请注明出处:http://beniao.cnblogs.com/  或 http://www.cnblogs.com/   作者:Beniao

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值