簡體   English   中英

如何建模函數式編程中的繼承關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM