24种设计模式学习记录第二篇
24种设计模式学习记录第二篇
没有脚的大笨鸟 发表于4年前
24种设计模式学习记录第二篇
  • 发表于 4年前
  • 阅读 29
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 计算器程序2

既然用了面向对象的程序设计语言,就要充分利用OO的三大特性:封装、继承、多态。大概说下这三个特性:

一.封装<数据保护>

    从字面意思上可以理解把一些东西封装起来,这里要封装的东西就是所谓的方法和属性。这样每个对象都包含它能进行操作所需要的所有信息,不必信赖其他对象来完成自己的操作。打个形象的比喻:我们的房子就是一个类的实例,室内的装饰与摆设只能被室内的居住者欣赏和使用,如果没有四面墙的遮挡,室内的所有活动在外人面前一览无遗。由于有了封装,房屋内的所有摆设都可以随意地改变而不影响他人。然而,如果没有门窗,一个包裹严实的黑箱子即使再广阔也没有实用价值。房屋的门窗,就是封装对象暴露在外的属性和方法,专门供人进出以及流通空气带来阳光。

    封装的好处:1,良好的封装能够减少耦合;2,类内部的实现可以自由的修改而不会影响外部的使用;3,类具有清晰的对外接口。

二.继承<代码复用>

    这个从字面意思也是很好理解,继承财产什么的,继承就意味着可以得到很多长辈的东西嘛。对象的继承是一种IS-A的关系,如果两个对象A和B,可以描述为'B是A,那么B可以继承A'(其实我一开始也糊涂什么是isa,我现在的理解是用这样一句英语:cat is a animal.)猫是哺乳动物,就说明了猫与哺乳动物之间继承与被继承的关系。实际上,继承者可以完全被被继承者,反之则不成立。所以,我们在描述继承的IS-A关系时,是不能相互颠倒的。继承定义了如何相互关联,共享特性。继承的工作方式是,定义父类和子类或叫基类和派生类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。如果子类继承于父类,第一、子类拥有父类非private的属性和功能(从生物角度来说,你有些地方长的必然像父亲);第二、子类具有自己的属性和功能,可以扩展父类没有的(由于基因问题,可能有些地方和父亲不同);第三、子类还可以以自己的方式实现父类的功能,这就是所谓的方法重写,是一种接口复用(父子俩都会吃饭,但是你不喜欢父亲吃饭的方式的话,可以选择一种你喜欢的吃饭方式)。

        继承的好处:使的所有子类的公共部分都聚焦在父类,代码得到共享,避免了重复;另外,继承使得修改和扩展都变得容易。当然这也增加了耦合度,所以只有在两个类具备isa关系时才考虑用继承~

三.多态(利用指针的静态类型和动态类型可以不一致这个原理)

多态表示不同的对象可以执行相同的动作,但是通过它们自己的实现代码来执行。举个例子说明,假设有这样一对父子,父亲是非常有名的京剧艺术家,儿子也一直跟父亲学习,将来有一天子继父业。有一天,父亲突然生病无法上台,但是票都卖出去了,只有让儿子代替父亲去表演,反正化妆之后他娘估计也认不出,结果上台之后表演不比父亲差,很成功。但是看戏的人没看出什么差别。强调几点:1.在这里子类以父类的身份出现,儿子代表老子表演,以父亲的身份出现;(我说这句话的时候是不是想起了老师们经常强调的一句话?好吧,上课补充了我的睡眠而不是知识~ 实现多态的俩个条件:一个是virtual关键字,另一个就是指向子类对象的基类指针,这里就是基类指针)2.子类在工作时以自己的方式来实现,儿子模仿的再好也是模仿,儿子只能用自己理解的表现方式去模仿父亲的作品(这里就是说实际指向的是子类对象);3.子类以父类的身份出现时,子类特有的属性和方法不可使用(否则还不露出马脚~)儿子经过多年的学习,其实已经有了自己的创作,自己人的绝活,但在此时,代表父亲表演时,绝活是不能表现出来的。当然,如果父亲还有别的儿子会表演,也可以代表父亲去表演的话道理也是一样的。

   刚才说了实现多态的俩个条件:一个是virtual关键字,另一个就是指向子类对象的基类指针。多态的原理是当方法被调用时,无论对象是否被被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用,即虚方法是按照其运行时的类型而非编译时类型进行动态绑定调用的。


以上就是OO特性的简单介绍,下面是修改的第一个版本

#include<iostream>

using namespace std;

class Operator{
public:
	double GetResult(double num1,double num2,char op)
	{
		double result = 0;
		switch(op)
		{
			case '+':
				result = num1 + num2;
				break;
			case '-':
				result = num1 - num2;
				break;
			case '*':
				result = num1 * num2;
				break;
			case '/':
				result = num1 / num2;
				break;
		}
		return result;
	}
};

int main(void)
{
	int num1,num2;
	char op;
	Operator cal;

	cout << "please input num1" << endl;
	cin  >> num1;
	cout << "please input num2" << endl;
	cin  >> num2;
	cout << "please input the operator" << endl;
	cin >> op;
	cout << num1 << " " << op << " "  << num2 << " " << "=" << " ";
	cout << cal.GetResult(num1,num2,op) << endl;

	return 0;

}







共有 人打赏支持
粉丝 6
博文 11
码字总数 5230
×
没有脚的大笨鸟
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: