第一课 什么叫做类?类有什么用处?

现在流行面向对象的开发语言,无论java还是.net,创建类对象都是开发的基础,但是究竟什么是类呢。

首先自己花5分钟想象一下。

 

类(Class)实际上是对某种类型对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。

  类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。
                                                                                ---------
引自百度百科。

其实我想每个人对类都有自己的理解,但是原则上基本与上述说明相同。

类是一类具有共同特征的事物的抽象。 好像教材上都这么说哦,这里我举例说明吧,便于大家理解。

 

下面我们试着来创建一个类。

首先想想一下人有什么特点。

1. 人都有姓名,姓名是一个人的标识。

2. 人都有年龄,生日。

3. 人都有身高体重。

就简单使用上面3项吧。

上面3项可以说是每个人都具备的属性。什么叫属性呢,其实可以和大家开发中的属性相对应,无非就是一些对象的变量而已。依据每个实例对象的不同,可能有不同的值。这样的就称作属性。

1.       public class Person

2.       {

3.         private string name;

4.         private string brithday

5.         private int age;

6.         private double height;

7.         private double Weight;

8.        

9.         public string Name

10.     {

11.       set { this.name = value; }

12.       get { return this.name; }

13.     }

14.     public string Brithday;

15.     .

16.     .

17.     .

18.     下面省略。比较懒

19.    

20.   }

21.    

 

现在我们基本可以完成上述类的定义了。

再看看人有什么能力呢?

1. 人可以说话

2. 人可以走路

3. 人可以吃东西

上述的不是属性,大家应该可以理解吧。你无法用一个常量来描述他,因为他是一种能力,一个动作。开发中我们叫做“方法”

我们可以为上述类对象添加几行代码了。

1.        public void Talk(string content)

2.        {

3.          Console.WriteLine(this.name + ":"+content);

4.        }

5.         

6.        public void Walk(int km)

7.        {

8.          Console.WriteLine(this.name + "步行:"+km+"公里");

9.         

10.     }

11.      

12.     public void Eat(string food)

13.     {

14.       Console.WriteLine(this.name + "吃了:"+food);

15.      

16.     }

 

到此,我们就完成了一个简单的“人”类的定义。

相信大家应该知道什么叫做类了吧。

 

好了,那么咱们的话题继续。

我如果想要继续写两个类,“工人”类,和“经理”类,那么我应该怎么办呢?

首先,我们已经有了一个“人”类的定义,工人和经理自然都是人喽,这里就引出了继承。

下面看代码

1.        public class Worker : Person

2.        {

3.         

4.        }

5.         

6.        public class Manager : Person

7.        {

8.         

9.        }

 

两个类都继承“人”类 Person ,所以之前人类定义的属性和能力他都拥有。

但是这两个类都有独特的地方,就是,他们都是职员,都要干活发工资的,下面给他们扩展两个方法。代码如下:

1.        public class Worker : Person

2.        {

3.          public void GetPay()

4.          {

5.            Console.WriteLine("1000");

6.          }

7.          

8.          public void Work()

9.          {

10.         Console.WriteLine(工地干活,体力劳动。");

11.       }

12.     }

13.      

14.     public class Manager : Person

15.     {

16.       public void GetPay()

17.       {

18.         Console.WriteLine("5000");

19.       }

20.       

21.       public void Work()

22.       {

23.         Console.WriteLine("制定工作计划,指挥工人干活。");

24.       }

25.     }

大家看到了,这样两个类基本就完成了。并且代码相对简单,并易于维护。

为什么呢。

首先如果我发现人类还有别的能力或者属性,我只需要在“Person”类中添加相应代码。

并不需要更改工人和经理两个类。

反之,如果我想要改一下工人或者经理的能力或属性的话,“人”类不受任何影响。这就是类继承的好处。

这里大伙是不是觉得,工人和经理也有独有的属性和能力哦。发工资和工作的方法看上有好像也重复哦。

那么我们继续修改这两个类的实现方法。但是我们已经继承了Person了,现在面向对象的语言好像多数不支持多继承啊,怎么办呢。别急,其实仔细分析一下这两个类的特点,他们都拥有人所拥有的属性及能力,只是在其基础上多了2个能力。再仔细观察,其实这两个能力的具体实现并不相同,所以这里继承并不适用。那么正确的选择是什么呢,答案是,“接口”。废话少说,代码说话。

1.        public interface IWork

2.       

3.        void GetPay(); 

4.        void Work(); 

5.        }

我们定义上述接口,里面声明了两个方法,发工资和干活。

可以发现,发工资和干活使我们这里作为工人和经理两类“人”需要做的事情。

俗话说得好“接口定义行为”,这里就是了,我定义了人需要干的两个行为,下面实现他。

 

26.     public class Worker : Person , IWork

27.     {

28.       public void GetPay()

29.       {

30.         Console.WriteLine("1000");

31.       }

32.       

33.       public void Work()

34.       {

35.         Console.WriteLine(工地干活,体力劳动。");

36.       }

37.     }

38.      

39.     public class Manager : Person , IWork

40.     {

41.       public void GetPay()

42.       {

43.         Console.WriteLine("5000");

44.       }

45.       

46.       public void Work()

47.       {

48.         Console.WriteLine("制定工作计划,指挥工人干活。");

49.       }

50.     }

 

貌似这次我们没有节省什么代码哦,那么折腾半天有什么好处到底。

下面来分析一下。

首先,这次确实没有少些代码,反而多了,这是事实。但是还是有用的。

来看,我们IWork这个接口,它定义了工作这个行为。从整体上来看,这里我们是要让“人”类来给我们干活,并付给其工资。这个接口定义了我们要人做的“工作”这个行为。

接口里没有具体行为的实现方法,只是一个定义,作用是明确思路。只要实现这个接口的类,必须要实现相应的方法。具体实现方式不限。这里就很好的处理了“工人”和“经理”工作不同,获得的薪水不同的问题。

其次,对于“工作”这个行为的处理上,也有很大好处。比方说,现在我可以实现这么一个方法。

1.        public void DoWages(IWork i)

2.        {

3.          i.GetPay();

4.        }

这是一个统一发工资的方法,注意看参数,是IWork接口。为什么呢,接口不能实例化对象哦。可 能学校 老师都这么给学生讲过。现在我告诉你,接口可以有实例对象,不过是引用。

比方说这里我可以这样写:

1.        IWork iw = new Worker();

2.        IWork im = new Manager();

我可以肯定,这两句话编译器不会报任何错误。

相信你已经发现了,我用接口去引用了实现接口的类的实例。

这在面向对象的语言中是被允许的。因为类对象必须要实现接口中的方法,所以引用不构成任何隐患。并且引用对象只能调用接口中定义的方法。

下面言归正传,看发工资的这个通用方法。

DoWages这个方法的参数是IWork接口。他就允许我传入Worker的对象也可以,传入Manager对象也可以。这样我无论给谁发工资,都直接调用该方法就可以方便的实现。

 

相信你已经体验到接口的用处了吧。

下面把今天的内容好好消化一下吧。这是设计模式基础中的基础哦。

 

下一课开始,准备跟大家探讨下设计模式中的几个重要原则。

这个系列是我原创的第一个系列哦,可能存在很多问题,希望大家友情指出,谢谢。

对了,欢迎转载,转载请注明出处,谢谢。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值