Swift中如何为两个不同类复用同一方法?
嘿,你完全不用忍受重复代码!这个需求有几个非常优雅的解决办法,我来给你拆解下:
首先先明确你的核心问题:想要复用doSomething()的逻辑,同时让方法里的self能正确识别为Class1或Class2的实例。之前你考虑过协议但误以为必须每个类单独实现,其实协议扩展可以提供默认实现,完美解决这个问题!
方案一:协议+默认扩展(推荐,灵活无继承限制)
这是Swift里处理这类复用场景的最佳实践之一,既保留了类型的独立性,又能共享通用逻辑:
// 1. 定义协议,约定每个类必须实现的专属方法 protocol DoSomethingCapable { func doSomethingOnClass() } // 2. 给协议添加扩展,提供通用的doSomething实现 extension DoSomethingCapable { func doSomething() { // 这里的self会自动指向遵守协议的具体类实例(Class1或Class2) self.doSomethingOnClass() } } // 3. 让你的类遵守协议,只需要实现各自的专属逻辑 class Class1: DoSomethingCapable { func doSomethingOnClass() { print("Class1 执行专属逻辑") // 这里可以直接用self访问Class1的属性和方法 } } class Class2: DoSomethingCapable { func doSomethingOnClass() { print("Class2 执行专属逻辑") // 这里的self就是Class2的实例 } }
为什么这个方案可行?
协议扩展里的self是遵守协议的具体类型,所以调用Class1().doSomething()时,self.doSomethingOnClass()会精准调用Class1的实现,完全符合你的需求,而且doSomething()的逻辑只写了一次,没有重复代码。
方案二:基类继承(适合可共享父类的场景)
如果Class1和Class2本来就适合共享一个父类(比如它们同属一类业务对象),也可以用继承的方式:
// 定义基类,实现通用的doSomething方法 class BaseDoer { func doSomething() { self.doSomethingOnClass() } // 标记为必须由子类重写的方法 func doSomethingOnClass() { fatalError("子类必须实现这个专属方法") } } // 子类继承基类,只需要重写专属方法 class Class1: BaseDoer { override func doSomethingOnClass() { print("Class1 执行专属逻辑") } } class Class2: BaseDoer { override func doSomethingOnClass() { print("Class2 执行专属逻辑") } }
注意点:
Swift是单继承语言,如果Class1或Class2已经有其他父类了,这个方案就不适用了,这时候协议扩展的灵活性就体现出来了。
总结
- 如果你的类没有继承限制,优先选择协议扩展,它更灵活,也符合Swift的协议导向编程思想;
- 如果类适合共享父类,继承也是个不错的选择;
- 完全不需要接受重复代码,这两种方案都能完美解决你的问题!
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

