我怎样才能“显式”地快速实现一个协议?如果不可能,为啥?
Posted
技术标签:
【中文标题】我怎样才能“显式”地快速实现一个协议?如果不可能,为啥?【英文标题】:How can I "explicitly" implement a protocol in swift? If it is impossible, why?我怎样才能“显式”地快速实现一个协议?如果不可能,为什么? 【发布时间】:2017-05-02 16:39:05 【问题描述】:在 C# 中,this great language feature 称为“显式接口实现”,允许您实现两个或多个接口方法名称冲突的接口。它还可以使方法在您使用封闭类型的对象调用它时做一件事,并在将其转换为接口类型然后调用该方法时做另一件事。我想知道 Swift 中是否有这样的事情。这是否与 swift 的任何意识形态相冲突?
基本上我想做这样的事情:
struct Job: CustomStringConvertible
var location: String
var description: String
var CustomStringConvertible.description: String
return "Work Location: \(self.location), description: \(self.description)"
Job(location: "Foo", description: "Bar").description // "Bar"
(Job(location: "Foo", description: "Bar") as CustomStringConvertible).description // "Work Location: Foo, description: Bar"
我在 Internet 上找到了 this,但我认为这无关紧要,因为它似乎是关于在子类中强制方法覆盖。
【问题讨论】:
你的问题我不是很清楚,一个类型可以采用两个具有相同方法名的协议,比较***.com/questions/31586864/…。 我知道。但是我想要一种类型来实现两个具有相同方法签名的协议不同地,就像在 MSDN 示例中一样。我想要的主要事情实际上是实现类似于问题中的代码 sn-p 的东西,即通常,someJob.description
返回一个值,但是当您通过执行(someJob as CustomStringConvertible).description
访问description
时,它返回另一个值。 @MartinR
问题是,我不确定这是否适合 swift。这就是为什么我问Does this conflict with any of swift's ideologies?
。另外,我真的不知道如何写提案...@matt
更深层次的问题不是“它是否与意识形态冲突”,而是“它允许开发人员以优雅的方式解决的重要问题是什么?”每个新功能都是复杂的。这个功能给我们带来了什么,它的复杂性又值多少钱?我在这里看到的唯一好处是Job
不符合CustomStringConvertible
,但碰巧实现了一个具有相同名称但语义冲突的方法,并且(出于某种未知原因),它是不可能改变Job
。因此,对于一个尴尬的问题,这是一个令人困惑的解决方法。
就我个人而言,我不明白为什么这是一个“很棒的语言功能”。如果我被允许称鸭子为猫,并且当我告诉它嘎嘎叫它时,它会喵喵叫而不是嘎嘎叫,那不是“好”——这是“疯狂”。多态性的全部意义在于对象具有完整性;它对一个方法的实现取决于它是什么,而不是你如何cast它。协议扩展已经把事情搞砸了。
【参考方案1】:
协议扩展基本上已经做了你所描述的:
protocol Cat
extension Cat
func quack()
print("meow")
class Duck : Cat
func quack()
print("quack")
let d = Duck()
d.quack() // quack
(d as Cat).quack() // meow
【讨论】:
而且,我可以补充一点,就协议扩展 do 已经完成您所描述的事情而言,它们是一种恐怖。这种行为让大量程序员感到困惑。 哦,我从没想过协议扩展会这样! @Sweeper:请注意,这仅在协议定义本身中未列出该方法时才有效。如果您将func quack()
添加到protocol Cat
,那么无论您如何称呼它,鸭子都会嘎嘎叫。以上是关于我怎样才能“显式”地快速实现一个协议?如果不可能,为啥?的主要内容,如果未能解决你的问题,请参考以下文章