首页 > 其他分享 >面向对象-该绕路就不能走捷径

面向对象-该绕路就不能走捷径

时间:2024-06-18 20:28:33浏览次数:21  
标签:拥有 面向对象 绕路 访问 走捷径 订单 产品 pOrderitem Order

文章目录

概要

面向对象除了“谁的事情谁负责”原则外,还有一个就是“该绕路就不能走捷径”。是指存在拥有或者单向访问关系的类对象之间存在的一种访问规则。拥有关系,是指必须通过拥有者才能访问被拥有的对象,单项访问是指甲对象能访问已对象,已对象不能访问甲对象。

例如下面三个类:订单拥有订单项,订单项能访问产品,产品不能访问订单项。 

拥有关系和单向访问

代码如下:

#include <iostream>
#include <string>
using namespace std;

class Order
{
private:
	string datetime;
	int price;
	OrderItem* pOrderitem;//订单拥有订单项 (是拥有的关系) 
public:
	void Order(); 
	pOrderitem* addItem();
	float calculate_price()//计算价格 
};

void Order::Order()
{	//...必要的初始化,一个订单可能有多个订单项,
    //创建空的订单项集,因为是拥有的关系,所以订单类要“操心”订单项的所有事,
    //当然,具体做还得订单项自己去做
	OrderItem* pOrderitem = new OrderItem; 
}

//实际项目中,根据用户购买的产品随时创建订单项,如果在其他地方创建,
//可以通过参数传递,总之都要交给 pOrderitem管理,才能体现拥有关系 
pOrderitem* Order::addItem(/*OrderItem&*/)
{
	pOrderitem++;
	pOrderitem = &OrderItem; //追加到订单项集末尾,可以有不同写法 
}
	
float Order::calculate_price() 
{
	for(..;pOrderitem;..)//每个订单项都要计算 
		price = price +	pOrderitem->calculate_cost();//实际上要交给订单项去算价格 
}

class OrderItem 
{
private:
	int num;//购买数量
	float cost;//订单项价格(不是单价)
public:    
	float calculate_cost() 
    {
    	string name="电饭锅"//此时,订单项已经能决定要哪个产品了,
                            //实际项目中,产品名称或者其ID取自界面;

       //产品和订单项不是拥有的关系,所以可在订单项类里随时、
       //临时地创建对象(不是拥有关系就不需要将其作为订单项的一个成员) 
    	Product* p = new Product(name);

		return p->getUnitprice() * num;//数量是订单项的,单价是产品的 
		} 
};

class Product
{
private:
	string productName;
	float unitPrice;
public:
	void Product(string name)
	{
	productName = name;
	//... 再根据产品名称获得unitPrice,来源包括数据库等 
	}
	float getUnitprice();	
};

int main() {
	Order order1;
	//... 
		 
	order1.calculate_price();  
	return 0;
}

总结:

  • 订单“不知道”产品的存在,因此,从来不会直接访问产品,都要通过订单项来访问;
  • 要计算订单总价,需要通过订单项去算,订单项计算时缺产品单价,获取单价就必须交给产品去做;这就是谁的事情谁负责,见上一个文章。
  • 类之间拥有的关系,即模型上的菱形线,代码中体现为数据成员,和数据库实体的外键不是一回事;
  • 订单项和产品之间的单项箭头,是指订单项能访问产品,即订单项类里可以创建产品的临时对象,但产品类中不允许创建订单项对象,否则就是双向箭头,直接画成一条线就可以双向访问了;
  • 模型中类之间访问关系同样不是数据库实体的主外键的关系,所以一个类中没有另外一个类的ID或者名字;
  • 这里解释一下怎么确定的拥有关系和单向访问关系,因为订单项只能被订单拥有,它自己单独存在没什么意义,产品不一样,考虑可重用性因素,产品单价可单独维护,一般对接产品库存系统,有没有订单订单项,产品以及库存都存在。

标签:拥有,面向对象,绕路,访问,走捷径,订单,产品,pOrderitem,Order
From: https://blog.csdn.net/workflower/article/details/139762468

相关文章

  • 面向对象-谁的事情谁负责
    文章目录概要例子答案之一答案之二答案之三概要面向对象(ObjectOriented)是一种编程范式,是一种对现实世界理解和抽象的方法。这种理解性很强的知识需要漫长的时间去理解和掌握。需要掌握的原则之一就是:谁的事情谁负责。例子编程序,实现学生日常选课、给学生登记平时......
  • 第一百一十节 Java面向对象设计 - Java泛型类
    Java面向对象设计-Java泛型类使用泛型,我们可以在不知道代码操作对象的类型的情况下编写代码。它允许我们创建泛型类,构造函数和方法。泛型类是使用形式类型参数定义的。形式类型参数是一个逗号分隔的变量名列表,位于类声明中类名后面的尖括号<>中。语法下面的代码声明一......
  • Java面向对象:初识继承
    继承:一个类(子类或派生类)继承另一个类(父类或基类)的特性(属性和方法)。1、继承1.1、不使用继承例子:classDog{Stringname;intage;publicDog(Stringname,intage){this.name=name;this.age=age;}publicvoideat(){......
  • 面向对象程序设计1.2 类之间的组合关系
    一、复习一下在1.1里我们定义了类Date,忘记的小伙伴可以看看下面的代码classDate{private:intyear;intmonth;intday;//数据成员,默认为私有public:Date():year(2000),month(1),day(1){}//不带参数的构造函数Date(intyear,intmonth,in......
  • 【PL理论】(29) OOP:面向对象编程 | 案例研究:C++ 中的类 | 继承 | 继承和指针 | Object
    ......
  • C++面向对象三大特性
    C++三大特性包括了封装、继承、多态。封装:封装是将数据属性和操作这些数据的函数(方法)捆绑在一起的过程。它隐藏了实现细节,只暴露出一个可以被外界访问的接口。封装允许开发者将对象的实现细节保护起来,只提供必要的操作界面,从而减少错误和提高代码的可维护性。继承:继承是一种......
  • 面向对象 这一文拿捏了 ⭐ (建议收藏)
    面向对象中级部分已整理完成,建议收藏......
  • 第一百零九节 Java面向对象设计 - Java抽象类和方法
    Java面向对象设计-Java抽象类和方法Java可以定义一个类,其对象不能被创建。它的目的只是表示一个想法,这是其他类的对象共有的。这样的类称为抽象类。语法我们需要在类声明中使用 abstract 关键字来声明一个抽象类。例如,下面的代码声明一个Shape类的抽象:publicabstr......
  • R 语言入门 —— 面向对象
    R语言入门——面向对象文章目录R语言入门——面向对象S3类1.基本概念2.创建S3对象3.创建泛型函数4.S3对象的继承5.缺点S4类1.创建类和对象2.属性访问3.类型检查和默认值4.泛型函数与方法5.继承6.与S3交互RC类1.创建类和对象2.定义和使用方......
  • Java面向对象基本特征——抽象、接口、多态、内部类
    面向对象概述        面向对象思想是从现实世界客观存在的事物出发来构造软件系统。对象是现实生活中实际存在的事物;类是由相同类型的对象共有的特征和行为归纳构成的。    而面向对象的思想就是把现实世界中的对象所具有的特征和行为抽象出来形成一个类,再根......