我是Haskell的新手,希望在Haskell中实现这段C#代码。我想继承字段"title"
,或者让它成为所有产品所必需的,但我创建的所有示例都是关于函数而不是字段的。
public abstract class Product
{
public string title;
public string getTitle()
{
return title;
}
}
public class Videotape : Product
{
}
public class Book : Product
{
public string authorName;
}
Haskell不是一种面向对象的语言,因此继承的概念并不直接存在。类似的事情有很多方法,选择合适的方法需要更多的背景。
一种方法如下。
您可以将示例中的继承看作实现了两件事:
-
Product
的所有子类都包含一个字段title
-
Product
的所有子类都支持返回字符串的方法getTitle
。
如果我们把这两件事都看作是分开的,那么下面的解决方案就说明了这一点。
首先,产品数据类型:
data Product = Product { title :: String }
这将创建一个数据类型Product
,其中包含一个构造函数,也称为Product
,包含一个类型为String
的字段(称为title
)。CCD_ 10是作为类型CCD_。
现在,让我们为Product
创建一个类型类,描述getTitle
方法。类型类与C#/OOP中的类不是一回事,而是更类似于接口的概念。
class Product' a where
getTitle :: a -> String
该类型类声明了一个方法getTitle
,该方法采用a
,其中a
是Product'
的实例,并返回一个String。
接下来,我们将为Product'
定义一个Product'
的实例。
instance Product' Product where
getTitle = title
这将Product
定义为Product'
的实例。这使sit能够取代预期Product'
实例的a
。这意味着getTitle
可以在Product
上调用,所以我们必须定义它应该做什么。在这种情况下,getTitle
应该简单地做与title
相同的事情,即返回title
字段。
现在让我们定义";子类":
data Videotape = Videotape { vtProduct :: Product }
data Book = Book { bProduct :: Product, authorName :: String }
我们创建了两种数据类型。CCD_ 29只包含一个类型为CCD_。Book
还添加了自己的字段authorName
。(Product
字段必须具有唯一的名称。Haskell将每个字段转换为一个函数,并且在同一模块中不能有两个同名的函数)。
现在让我们定义这些类型的实例:
instance Product' Videotape where
getTitle vt = getTitle (vtProduct vt)
instance Product' Book where
getTitle b = getTitle (bProduct b)
现在,您可以对任何一种类型的对象调用getTitle
,并获得与其标题相对应的String
。
我相信这里有很多你不熟悉的术语和概念,但如果你读过它们,你可能会理解Haskell是如何以不同的方式做很多事情的,并拓宽你设计和编写软件的方法。
你可能会发现这些资源很有用:
Haskell Wiki 中OOP与类型类的比较Haskell支持面向对象编程吗?SO
哈斯克林快乐!