我在某处读到,你可以将Prolog中的模块视为对象。我正在试图理解它,并确定它是否是一种好的编程方式。
如果我有两个文件,一个定义了一个类别dog,然后另一个文件使用这个类别来创建两个dog对象。
:- module(dog,
[ create_dog/4,bark/1 ]).
create_dog(Name,Age,Type,Dog):-
Dog = dog(name(Name),age(Age),type(Type)).
bark(Dog):-
Dog = dog(name(_Name),age(_Age),type(Type)),
Type = bassethound,
woof.
bark(Dog):-
Dog = dog(name(_Name),age(_Age),type(Type)),
Type \= bassethound,
ruff.
woof:-format("woof~n").
ruff:-format("ruff~n").
第二个文件
use_module(library(dog)).
run:-
dog:create_dog('fred',5,bassethound,Dog),
forall(between(1,5,_X),
dog:bark(Dog)
),
dog:create_dog('fido',6,bloodhound,Dog2),
dog:bark(Dog2).
这段代码创建了一个名为Dog的猎犬对象,让它吠叫5次。接着,又创建了另一个名为Dog2的大猎犬对象并使其也吠叫。我知道在面向对象编程中,对象拥有状态和行为。因此,现在我有了两个根据自身状态表现不同行为的对象,但目前我将对象的状态存储在Dog变量中,以便主程序中的代码可以看到它们。是否有一种方法可以隐藏对象的状态,即有私有变量吗?
例如,我可能想要为每个狗对象存储状态has_barked,如果它之前已经吠过了,则为true,否则为false,然后根据此更改bark /1的行为。
此外,您如何处理继承和覆盖方法等问题?欢迎提供任何相关阅读材料。谢谢。