Engee中的面向对象编程:结构与方法
面向对象编程(oop)是一种基于"对象"概念的编程范例,可以包含数据(以字段或属性的形式)和代码(以方法的形式)。 OOP的基本原则包括:
- 封装-在一个结构中结合数据和处理它们的方法
- 继承-基于现有类创建新类的能力
- *多态性—-不同类的对象响应相同消息的能力
Engee是一种编程语言,最初是为高性能计算而开发的,并不是纯粹的面向对象语言。 但是,它通过以下方式支持一些OOP概念:
-自定义类型(结构)
-多个调度(一个更强大的替代类方法)
-组成(而不是继承)
Engee的方法与Python或Java等语言中的传统OOP不同,但它允许您以更灵活的方式实现类似的结果。
Engee的OOP风格特别有用。:
-处理复杂数据结构时
-当需要对具有明确实体的主题区域进行建模时
-用于在大型项目中组织代码
-当需要函数的多态行为时
虽然Engee不是纯粹的面向对象语言,但它为组织OOP风格的代码提供了强大的工具。 结构与多个调度相结合的使用为传统的OOP提供了一个灵活的替代方案,它可以在科学计算和Engee创建的其他领域更具表现力和生产力。
代码示例分析
让我们来看看这个示例,它演示了Engee中OOP的基本功能。:
struct Person # 定义类型(类的模拟)
name::String
age::Int
end
在这里我们创建一个结构 Person 有两个字段: name (字符串)和 age (整数)。 在OOP术语中,这类似于创建具有属性的类。
function greet(person::Person) # Person类型的方法(类似于类方法)
println("嗨,我的名字是$(person.name ),我是$(人。龄)岁!")
end
这是一个专门用于处理类型的函数 Person. 在Engee中,方法不像经典的OOP那样"属于"对象,但是由于多次调度,我们可以为不同类型创建函数的专门版本。
function test_person()
person = Person("安娜", 25)
@assert person.name == "安娜"
@assert person.age == 25
println("Greet()方法的测试:")
greet(person)
println("测试顺利通过!")
end
在测试函数中,我们创建一个结构的实例 Person,检查其字段并调用该方法 greet.
扩展示例:员工管理系统
让我们将示例扩展到更实际的应用程序。 此代码是在Engee中使用面向对象方法的简单员工管理系统的实现。 该系统基于两种用户类型: Employee (雇员)及 Manager (经理)。 类型 Employee 包含基本字段:identifier(id),名字(name)、系(department)和工资(salary). 类型 Manager 使用包含对象的合成 Employee 并通过添加经理特定的字段,团队的规模(team_size)和奖金(bonus).
该代码通过几个专门的功能演示了OOP的关键原则。 功能 annual_salary 它有两种实现方式—对于普通员工(简单地将月薪乘以12)和经理(为年薪增加奖金)。 功能 print_info 它还为不同类型的员工重载,提供多态行为-根据对象类型输出不同的信息。 功能 give_raise! 通过指定的百分比修改员工的工资,使用可变数据演示工作(函数名称中的感叹号是具有副作用的函数的Engee约定)。
测试功能 test_employee_system 创建员工和经理的实例,演示所有方法的操作。 实现的一个特点是Engee对OOP的方法-而不是经典的继承,使用组合(管理器包含一个employee对象),通过多次调度(针对不同类型的参数的不同函数实现)实现多态性。 该代码说明了如何在Engee中组织数据结构和OOP风格的行为,同时保持语言的高性能。
mutable struct Employee
id::Int
name::String
department::String
salary::Float64
end
struct Manager
employee::Employee
team_size::Int
bonus::Float64
end
function annual_salary(emp::Employee)
emp.salary * 12
end
function annual_salary(mgr::Manager)
(mgr.employee.salary * 12) + mgr.bonus
end
function print_info(emp::Employee)
println("""
雇员:$(emp.name )
ID: $(emp.id)
部门:$(emp。系)
月薪:$(emp.薪金)
年薪:$(annual_salary(emp))
""")
end
function print_info(mgr::Manager)
println("""
经理:$(mgr.employee.name )
ID: $(mgr.employee.id)
部门:经理雇员。系)
团队规模:$(mgr.team_size)
月薪:$(mgr.雇员。薪金)
奖金:$(经理。奖金)
年薪:$(annual_salary(mgr))
""")
end
function give_raise!(emp::Employee, percent::Float64)
emp.salary *= (1 + percent/100)
println("工资$(emp.name )增加了$%%")
end
# 创建正式员工
emp1 = Employee(101, "伊万*彼得罗夫", "IT", 1500.0)
# 创建经理(包含员工)
mgr1 = Manager(Employee(201, "安娜*西多罗娃", "IT", 2500.0), 5, 5000.0)
# 我们输出信息
println("\N有关员工的信息:")
print_info(emp1)
println("\关于经理的信息:")
print_info(mgr1)
# 我们提高工资
give_raise!(emp1, 10.0)
give_raise!(mgr1.employee, 8.0) # 联络附属雇员
# 检查新工资
println("\增加后:")
print_info(emp1)
print_info(mgr1)
println("测试成功完成!")
结论
总而言之,值得再次弄清楚Engee中函数式编程的哪些类似物和特性可以用来实现面向对象的方法。
工程中OOP的主要概念
-
结构而不是类:Engee使用结构(
struct)来创建可以包含数据但不能包含方法的自定义类型(函数是单独定义的)。 -
多重调度:与传统的OOP不同,方法"属于"对象,在Engee中函数是独立定义的,并且根据所有参数的类型选择特定的实现。
-
组合而不是继承:Engee不支持经典继承。 相反,建议使用组合(在另一个对象中包含一个对象),如示例中所示
Manager,含Employee. -
封装:默认情况下,Engee中结构的所有字段都是公共的。 模块或命名约定可用于封装(例如,用下划线开始私有字段)。
-
多态性:通过多个调度实现-同一函数的不同方法可以根据参数的类型调用。
Engee方法对巴解组织的优点****
-
灵活性:多重调度比经典的OOP更强大,因为它允许您根据所有参数选择方法的实现,而不仅仅是第一个参数(如Python或Java)。
-
性能:Engee类型系统和编译器针对结构进行了优化,可确保高性能。
-
代码清晰:分离数据(结构)和行为(方法)可以使代码更清晰,更易于维护。