jus*_*ive 2 oop inheritance f# functional-programming
面向对象的编程范例使用继承来建模遵循泛化 - 专业化关系的实体之间的关系.这里,Base类用于封装一组实体的公共(常规)属性和行为,Derived Classes 通过添加其他属性和/或添加/修改现有行为来扩展基类.
作为功能编程的新手,我需要在F#等函数语言中建模这种关系的指导.
例如,建模如下所示的简单情况的最佳方法是什么:
abstract class Tutorial {
private String topic;
abstract public void learn();
}
class VideoTutorial extends Tutorial {
private float duration;
public void learn () {
System.out.println ("read PDF");
}
}
class PDFTutorial extends Tutorial {
private int pageCount;
public void learn () {
System.out.println ("Watch Video");
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用教程集合并调用学习 观察多态行为.
在功能设计中,你会对事物有所不同,因此这些想法不会完美映射.通常,功能设计更侧重于表达您正在使用的实体的数据类型.在您的情况下,您可以TutorialKind使用区分联合定义哪个是视频或PDF,Tutorial然后是一种类型及其主题的记录:
type TutorialKind =
| VideoTutorial of duration:float
| PDFTutorial of pageCount:int
type Tutorial =
{ Kind : TutorialKind
Topic : string }
Run Code Online (Sandbox Code Playgroud)
请注意,这只保留了有关教程的数据.任何功能都可以在与教程类型匹配的函数中实现:
let learn tutorial =
match tutorial.Kind with
| VideoTutorial _ -> printfn "Watch video"
| PDFTutorial _ -> printfn "Read PDF"
Run Code Online (Sandbox Code Playgroud)
请注意,这可以在与OO版本不同的方向上进行扩展.在OO中,您可以轻松添加新的子类; 在这里,您可以轻松添加新功能.在实践中,功能人员通常对此更改感到满意,但F#是一种混合语言,如果您需要"OO风格的可扩展性",则可以轻松使用界面.
| 归档时间: |
|
| 查看次数: |
696 次 |
| 最近记录: |