现在流行面向对象的开发语言,无论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对象也可以。这样我无论给谁发工资,都直接调用该方法就可以方便的实现。
相信你已经体验到接口的用处了吧。
下面把今天的内容好好消化一下吧。这是设计模式基础中的基础哦。
下一课开始,准备跟大家探讨下设计模式中的几个重要原则。
这个系列是我原创的第一个系列哦,可能存在很多问题,希望大家友情指出,谢谢。
对了,欢迎转载,转载请注明出处,谢谢。