如何实现方法的自定义实现?
How to implement custom implementation of method?
出于某种原因我画了一个空白..如果我想从 class 中制作一堆对象,但我希望每个实例都有自己独特的特定方法实现,如何我会这样做吗?
例如:
class MyClass {
var name: String
func doSomething() {
// Each object would have custom implementation of this method, here.
}
}
我是否在初始化期间为每个对象提供自己的闭包,然后在 doSomething()
方法中调用该闭包?我试图找出正确或“迅速”的方法来做到这一点。我也在考虑一些带有协议的东西,但我似乎无法弄清楚如何去做。
我认为有很多方法可以做到。
如果是 Base class + 一些子classes(例如 Animal
,subclassed by Dog
、Cat
等),您可以这样做:
首先定义一个协议是个好主意:
protocol MyProtocol {
func doSomething()
}
还提供一个默认实现,如果 class 没有覆盖该方法,它会抛出一个致命错误:
extension MyProtocol {
func doSomething() {
fatalError("You must override me")
}
}
现在你的基地 class 由于默认实施确认协议。但是它会在运行时间抛出致命错误:
class MyClass: MyProtocol {
// conformant
}
子 class 但是,只要它覆盖此函数,就会 运行 正确:
class MyOtherClass: MyClass {
func doSomething() {
print("Doing it!")
}
}
您也可以将致命错误移至基础 class,而不执行任何扩展实现。
如果有许多相同的实例 Class,则该解决方案毫无意义。您可以使用非常简单的回调设计:
typealias MyDelegate = () -> Void
class MyClass {
var delegate: MyDelegate?
func doSomething() {
delegate?()
}
}
let x = MyClass()
x.delegate = {
print("do it!")
}
x.doSomething()
// Or you can use a defined function
func doIt() {
print("also doing it")
}
x.delegate = doIt
x.doSomething()
也可能是你在找Strategy pattern, or Template pattern。取决于您的使用详情。
Do I provide each object with its own closure during initialization, and then call that closure in the doSomething() method
是的。这是非常普遍的,而且非常 Swifty。令人难以置信的简约示例:
struct S {
let f:()->()
func doYourThing() { f() }
}
let s = S { print("hello") }
let s2 = S { print("goodbye" )}
s.doYourThing() // hello
s2.doYourThing() // goodbye
给一个对象一个可设置的方法实例属性是非常非常简单和常见的。它 没有 在初始化期间提供 - 您可以稍后设置此 属性,并且许多内置对象也以这种方式工作。
毕竟,这就是您使用 dataTask(with:completionHandler:)
创建数据任务时所做的全部工作。您正在创建一个数据任务并将其存储的函数交给它,它会在执行实际网络时调用该函数。
出于某种原因我画了一个空白..如果我想从 class 中制作一堆对象,但我希望每个实例都有自己独特的特定方法实现,如何我会这样做吗?
例如:
class MyClass {
var name: String
func doSomething() {
// Each object would have custom implementation of this method, here.
}
}
我是否在初始化期间为每个对象提供自己的闭包,然后在 doSomething()
方法中调用该闭包?我试图找出正确或“迅速”的方法来做到这一点。我也在考虑一些带有协议的东西,但我似乎无法弄清楚如何去做。
我认为有很多方法可以做到。
如果是 Base class + 一些子classes(例如 Animal
,subclassed by Dog
、Cat
等),您可以这样做:
首先定义一个协议是个好主意:
protocol MyProtocol {
func doSomething()
}
还提供一个默认实现,如果 class 没有覆盖该方法,它会抛出一个致命错误:
extension MyProtocol {
func doSomething() {
fatalError("You must override me")
}
}
现在你的基地 class 由于默认实施确认协议。但是它会在运行时间抛出致命错误:
class MyClass: MyProtocol {
// conformant
}
子 class 但是,只要它覆盖此函数,就会 运行 正确:
class MyOtherClass: MyClass {
func doSomething() {
print("Doing it!")
}
}
您也可以将致命错误移至基础 class,而不执行任何扩展实现。
如果有许多相同的实例 Class,则该解决方案毫无意义。您可以使用非常简单的回调设计:
typealias MyDelegate = () -> Void
class MyClass {
var delegate: MyDelegate?
func doSomething() {
delegate?()
}
}
let x = MyClass()
x.delegate = {
print("do it!")
}
x.doSomething()
// Or you can use a defined function
func doIt() {
print("also doing it")
}
x.delegate = doIt
x.doSomething()
也可能是你在找Strategy pattern, or Template pattern。取决于您的使用详情。
Do I provide each object with its own closure during initialization, and then call that closure in the doSomething() method
是的。这是非常普遍的,而且非常 Swifty。令人难以置信的简约示例:
struct S {
let f:()->()
func doYourThing() { f() }
}
let s = S { print("hello") }
let s2 = S { print("goodbye" )}
s.doYourThing() // hello
s2.doYourThing() // goodbye
给一个对象一个可设置的方法实例属性是非常非常简单和常见的。它 没有 在初始化期间提供 - 您可以稍后设置此 属性,并且许多内置对象也以这种方式工作。
毕竟,这就是您使用 dataTask(with:completionHandler:)
创建数据任务时所做的全部工作。您正在创建一个数据任务并将其存储的函数交给它,它会在执行实际网络时调用该函数。