gpt4 book ai didi

面向 Swift 协议(protocol)的混合作用域

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:20 25 4
gpt4 key购买 nike

我有一个面向协议(protocol)的编程概念性问题。假设我正在创建一个协议(protocol) Foo,我想在协议(protocol)扩展中使用函数 action() 来扩展 Foo。 action() 将始终基本相同,无论谁在实现,所以我不想重复这段代码。 action() 唯一改变的部分是 prop,prop 需要是一个实例属性。所以我的符合结构应该只需要定义 prop,然后 Action 就会正常工作。这段代码很好,看起来像这样:

protocol Foo {
var prop : String {get set}
}
extension Foo {
func action() -> String {
return prop + ": Applied Action."
}
}

但现在问题来了。假设 prop 是我不希望其他类访问的信息。我希望他们只能通过 action() 访问它。在当前的 swift 中,prop 必须至少是内部的,因为协议(protocol)是内部的,但我需要它是私有(private)的,这样消费类就不会意外修改属性或读取我只希望它们可以通过 action() 访问的信息.我可以将 action() 添加到协议(protocol)中,但每次结构符合时我都需要重写 action()。

同样的例子也可以扩展为一个函数:

protocol Foo {
//customization point by conforming class
func customAction(str: String) -> String
}
extension Foo {
func action() -> String {
//Do some default work
let str = "some string created from previous default work"
return customAction(str: str)
}
}

action() 将始终是相同的实现,除了 cusotmAction()。所以,我需要符合类来实现 customAction(),但我不希望任何外部类调用 customAction(),因为它只提供一些只能在 action() 内部使用的特定行为。因此,我需要将 customAction() 设为私有(private),但同样,这是不可能的。

所以这是我的问题,这只是面向协议(protocol)编程的一个分割吗?我怎样才能使用协议(protocol)来编写这种类型的代码而不给 prop/customAction() 太多范围或者不必一遍又一遍地重写 action() 中的相同代码?这个例子相当简单,但我面临着同一问题的更复杂版本。是否有不同的方式从 POP 的角度来看待这个问题,或者我应该寻找一种更面向对象的方法?

最佳答案

我认为这不一定是面向协议(protocol)编程概念的后备,而只是您使用它的语言的后备。也许 Swift 在设计时并没有考虑到这些情况。但是,我认为解决此问题的一种方法是使用组合,在其中创建一个对象,您希望定义诸如 action 之类的函数,在该对象中使用无法从外部访问的状态.看看这个例子:

struct Foo {
init(prop: String) {
self.prop = prop
}

func action() -> String {
return prop + ": Applied Action."
}

private let prop: String
}


class Test {
let foo = Foo(prop: "TEST")
}

在这种情况下,Test 可以定义自己的 prop,这与使用协议(protocol)时的方式非常相似(但不完全相同)。也就是说,您现在可以在 Test 实例中调用 foo 上的所有函数,而无需访问底层变量。这样做(使用组合)还可以让您清楚导致人们首先使用 POP 的继承问题。希望对您有所帮助!

关于面向 Swift 协议(protocol)的混合作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com