如何在Matlab中实现面向对象的编程

443 阅读6分钟

如何在Matlab中实现面向对象的编程

面向对象编程是一种依赖于被称为对象的结构的编程方法。这种对象使得数据的属性和对该数据进行操作的各种函数很容易结合起来。

这些功能被称为方法。例如,你可以创建一个对象,记录一个移动粒子所覆盖的距离。这个对象可以作为构建现实世界中复杂系统的一个构件。

介绍

Matlab中的面向对象编程是用来管理你的代码的。它是通过将它们组织成类和函数来完成的。这使得随着时间的推移,对你的代码进行任何修改都更加容易。

你可以避免你的代码中的冗余,重复,并减少复杂性。在这篇文章中,我们将看看如何使用Matlab来实现这一点。

前提条件

  • 安装有[Matlab]。
  • 正确理解[Matlab]的基础知识。

面向对象编程的四个原则是。

  • 封装
  • 继承性
  • 多态性
  • 抽象

封闭性

封装是对某一事物的包围,或对其基本特征的描述。这种方法在编程中也有实施,但在这种情况下,我们使用类和对象。

类的主要用途是定义封装属性(数据)的对象和对该属性的操作。

这种方法从外部代码中隐藏了类的内部工作。为了实现隐藏功能的机制,我们有访问修改器,通过它可以限制一个类的方法和属性对另一个类的访问。

访问权决定了哪些其他方法和函数可以调用该方法。它还提供、获取和对属性的访问。

三种类型的访问包括。

  • 公共的--不受限制的访问(默认)。
  • 保护的--从类方法或其子类访问。
  • 私有的--只能从类的方法中访问(不能从子类中访问)。

如何在Matlab中实现封装

classdef employees
properties
name
baseSalary
end

在上面的代码中,我们演示了一个基本的雇员类。定义的属性是姓名和基本工资。如前所述,这里没有访问属性,因此它是公共的。

当访问属性没有被定义时,那么它们就默认为公共的。由于这是一个class employee ,我们可以将一些属性变成私有的。例如,可以是date of birthaddress 这样的属性,并指定可以访问这些属性的类methods

为了限制对某个组的访问,我们使用GetAccessSetAccessGetAccess 允许读取属性的值,而SetAccess 允许我们对属性进行赋值。

properties(Access=private)
dateOfBirth
address
end
properties(GetAccess = {?Engineer, ?Sales, ?TestEngineers})
dateOfJoining = 01/23/2020
department
end

值属性或加入和部门的状态可以从三个子类中读取,这三个子类是--工程师、销售和TestEngineers。然后我们有两个类方法,构造器(雇员)和函数getname

methods
function obj = employees(name, baseSalary)
obj.name = name;
obj.baseSalary = baseSalary;
end
function r = getname(obj)
r = obj.name;
return;
end
end
end

为了启动这个对象,我们调用构造函数。我们将对象命名为obj ,并调用函数employees,并传递参数namebaseSalary

这是由下面的命令完成的。

obj = employees("neha", 1000)

当我们在命令窗口中运行这个命令时,我们将得到我们的对象。

our property

继承

在这里,我们将类组织成层次结构。例如,在封装中,我们有一个带有参数name和baseSalary的类employees ,称为基类或超类。工程师和销售是拥有其属性(产品和佣金)的子类。

继承表达了两个对象之间的is-ahas-a 关系。它的优点是消除了多余的代码或重复使用从超类到子类的代码。

它们接受类,并继承其超类的公共属性。让我们在Matlab中实现这一点。在这种情况下,我们将看一下工程师这个类。

由于我们有了前面定义的基类employees,所以我们描述这个基类的子类,在本例中是工程师。这个子类有它的属性,也就是产品。

classdef Engineers< employees
properties
products
end

properties(Access=private)
team
end

小于(<)符号用来表示子类和超类的关系。

我们可以通过下面的中心从基类中访问超类的构造函数。

methods
function objE = Engineers(name, baseSalary, products)
objE@employees(name, baseSalary)
objE.products = products;
return
end

function y = Salary(objE, noOfHours)
y = objE.baseSalary*noOfHours;
return
end
end
end

我们也可以有一个销售的子类。

classdef Sales < employees
properties
commission
region
end
methods
function objS = Sales(name, baseSalary, region, commission)
objS@employees(name, baseSalary)
objS.region = region;
objS.commission = commission;
return
end
function S = Salary(objS, noOfHours)
S = (objS.baseSalary*noOfHours)*objS.commission;
end
end
end

objE ,是子类构造函数的输出,以及读取超类名称和参数超类所需的任何其他参数。

在Matlab中,你可以通过命令属性和类名来检查类的最终属性。

properties Engineers

这个属性具有超类雇员的所有公共属性。

properties engineer

多态性

多态性是面向对象编程中的一种技术,它允许你消除if,else, 或switch case 语句的长行代码。

为了在Matlab中实现这种技术,我们看一下我们在类工程师中使用的例子,它是在function salary.

% function for salary for an engineer
function y = Salary(objE, noOfHours) 
y = objE.baseSalary*noOfHours;
return
end
% function for salary for sales
function S = Salary(objS, noOfHours)
S = (objS.baseSalary*noOfHours)*objS.commission;
end

在上面的代码中,我们有一个函数工资。工程师类和销售类都有相同的输入参数,但是他们用不同的数学运算来计算工资。在这里,我们启动了我们每个类的对象objEobjS

我们使用超类的名称和基本工资,并为其属性提供新的值。例如,我们有我们的雇员'neha'。我们必须指定neha的产品和销售。我们首先指定我们的对象,即objEobjS

要定义objE

objE = Engineer(obj.name, obj.baseSalary, "simulink")

object engineer

我们对象的参数是姓名、工资和产品,也就是Simulink。

objS = Sales(obj.name, obj.baseSalary, "NA", 500)

这里的参数是姓名、工资、地区(在这种情况下是不适用(NA))和佣金(500)。

object sales

为了看到这些的影响,我们将在命令窗口中执行以下命令。

SE = Salary(objE, 10)  %Calculates the salary

SS =  Salary(objS,10)   %calculates the salary from sales

数值10是小时数。当我们分别运行这些代码时,我们会得到工资和销售额。

image showing results

根据数学运算,计算出的工资是不同的。

抽象

抽象可以说是封装的一种延伸。在我们的例子中,为了实现抽象,我们只在基类中定义了一个名为salary 的函数,而它的派生类将拥有该函数的实现。

在Matlab中,我们可以通过使类成为一个抽象类来实现抽象化。

classdef(Abstract) Employees
properties
name
baseSalary
end
methods
Salary(obj)
getName(obj)
end
end

当我们声明属性是抽象的、方法是抽象的、属性是抽象的,一个类就是抽象的。

上面的代码显示,方法和属性只在抽象类中定义,但实现将在支持其特定要求的子类中完成。

总结

面向对象的编程是有帮助的,因为它允许你的代码是有秩序的,它也有助于把它组织成类和子类。它增强了代码的清晰性。

面向对象的编程也使得随着时间的推移,在你的代码中做任何改变都不会有任何影响。它也使代码的可重用性得以实现,防止重复。