来自2个班级的对象

时间:2016-02-01 15:34:09

标签: swift

我有一个班级Admin和一个班级SecurityGuard。我想创建一个securitySupervisor对象,可以访问Admin和SecurityGuard方法。我不想创建第三个类(出于各种显而易见的原因,例如未来更改的简易性。)有没有办法让一个对象使用两个不相关的类中的方法?

谢谢。

3 个答案:

答案 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()