[英]how to model my game project in functional programming concept with OCAML?
[英]How to model inheritance relationship in Functional Programming
面向對象編程范式使用繼承來建模遵循泛化-專業化關系的實體之間的關系。 這里,基類用於封裝一組實體的公共(通用)屬性和行為,派生類通過添加附加屬性和/或添加/修改現有行為來擴展基類。
作為函數式編程的新手,我需要有關在 F# 等函數式語言中對此類關系進行建模的指導。
例如,模擬如下簡單情況的最佳方法是什么:
abstract class Tutorial {
private String topic;
abstract public void learn();
}
class VideoTutorial extends Tutorial {
private float duration;
public void learn () {
System.out.println ("Watch Video");
}
}
class PDFTutorial extends Tutorial {
private int pageCount;
public void learn () {
System.out.println ("Read PDF");
}
}
然后使用一組教程並調用學習來觀察多態行為。
在功能設計中,您對事物的看法有點不同,因此這些想法不會完美映射。 通常,功能設計更側重於表達您正在使用的實體的數據類型。 在您的情況下,您可以定義TutorialKind
,它是使用可區分聯合的視頻或 PDF,然后Tutorial
將成為包含一種類型及其主題的記錄:
type TutorialKind =
| VideoTutorial of duration:float
| PDFTutorial of pageCount:int
type Tutorial =
{ Kind : TutorialKind
Topic : string }
請注意,這僅保留有關教程的數據。 任何功能都可以在與教程類型匹配的函數中實現:
let learn tutorial =
match tutorial.Kind with
| VideoTutorial _ -> printfn "Watch video"
| PDFTutorial _ -> printfn "Read PDF"
請注意,這可以在與 OO 版本不同的方向上進行擴展。 在 OO 中,您可以輕松添加新的子類; 在這里您可以輕松添加新功能。 在實踐中,函數式人員通常對這種變化感到滿意,但 F# 是一種混合語言,如果您需要“OO 風格的可擴展性”,您可以輕松使用接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.