我有一个班级Admin
和一个班级SecurityGuard
。我想创建一个securitySupervisor
对象,可以访问Admin和SecurityGuard方法。我不想创建第三个类(出于各种显而易见的原因,例如未来更改的简易性。)有没有办法让一个对象使用两个不相关的类中的方法?
谢谢。
答案 0 :(得分:4)
使用两个协议并在一个类中实现它们。这是一个简单的例子,让你前进。
protocol Admin {
var isAdmin: Bool { get }
}
protocol SecurityGuard {
func protect()
}
class SecuritySupervisor: Admin, SecurityGuard {
var isAdmin = true
func protect() {
print("You're protected")
}
}
let securitySupervisor = SecuritySupervisor()
securitySupervisor.isAdmin // true
securitySupervisor.protect() // prints "You're protected"
还要记住,协议可以有默认实现,如果你想在多个类中使用相同的实现,那么这些实现很有用:
protocol Admin {
var isAdmin: Bool { get }
}
protocol SecurityGuard {
func protect()
}
extension SecurityGuard {
func protect() {
print("You're protected")
}
}
class SecuritySupervisor: Admin, SecurityGuard {
var isAdmin = true
}
class NormalGuard: SecurityGuard {}
let securitySupervisor = SecuritySupervisor()
securitySupervisor.isAdmin
// works like before
securitySupervisor.protect()
// same implementation
NormalGuard().protect()
答案 1 :(得分:1)
使用协议实现Swift中的多重继承。任何任意类型都可以声明为符合协议,只要它提供该协议规定的要求即可。
protocol Admin {
func administer()
}
protocol SecurityGuard {
func guardSecurity()
}
为了减少代码重复,可以使用协议扩展为符合协议的所有类型添加功能,包括为协议的要求提供默认实现:
extension Admin {
func administer() { print("Administering") }
}
extension SecurityGuard {
func guardSecurity() { print("Guarding Security") }
}
// Declaring conformance to the protocols is all that is required.
class BusyPerson: Admin, SecurityGuard {
init() { }
}
BusyPerson().administer()
BusyPerson().guardSecurity()
答案 2 :(得分:0)
一个非常非常简单的解决方案是:
import Foundation
class SecurityGuard
{
func securityFunc() { }
}
class Admin
{
func adminFunc() { }
}
class SecuritySupervisor
{
let securityGuard: SecurityGuard
let admin: Admin
init()
{
self.admin = Admin()
self.securityGuard = SecurityGuard()
}
}
SecuritySupervisor().securityGuard.securityFunc()
SecuritySupervisor().admin.adminFunc()