繁体   English   中英

swift:如何使用协议代替抽象类?

[英]swift: How to use protocols in place of abstract class?

我想知道如何在抽象类的地方使用协议。下面是我想用协议快速实现的用抽象类编写的方案:

public abstract class ModelA
{
  protected int productQuantity;
  protected String productUrl;
}

class ModelB extends ModelA
{
  // I want to access ModelA members here
}

我想使用协议快速实现以上功能。 任何帮助将不胜感激。

这是一个简单的示例,有关更多详细信息,您可以查看Apple Docs

protocol Shape {
    var width: Double { get set}
    var height: Double { get set}
    func area() -> Double
    func perimeter() -> Double
}

class Rectangle:Shape
{
    var width: Double
    var height: Double

    init()
    {
        width = 0.0
        height = 0.0
    }
    convenience init(width:Double, height:Double)
    {
        self.init()
        self.width = width
        self.height = height
    }
    func area() -> Double {
        return width * height
    }

    func perimeter() -> Double {
        return 2 * (width + height)
    }
}

|

    var rect = Rectangle(width: 5.0, height: 5.0)
    print(rect.area())
    print(rect.perimeter())

    rect = Rectangle()
    print(rect.area())
    print(rect.perimeter())

    rect.width = 10
    rect.height = 10
    print(rect.area())
    print(rect.perimeter())

该协议的实现应为:

protocol ModelA {
    // props
    var productQuantity: Int { get set }
    var productUrl:String { get set }
}

“我想在这里访问ModelA成员” ,实际上您ModelAModelB实现ModelA属性。 否则,您将得到一个编译错误,提示:

在此处输入图片说明

型号B:

class ModelB: ModelA {
    // default values
    var productQuantity: Int = 0
    var productUrl: String = ""

    // you can remove the default values after implementing 'init':
    init(productQuantity: Int, productUrl: String) {
        self.productQuantity = productQuantity
        self.productUrl = productUrl
    }
}

有关协议的更多信息,请参阅Apple文档

你可以这样写:

@objc protocol modelA
{
  @objc optional productQuantity:Int { get set }
  @objc optional productUrl:String { get set }
}

然后在课堂上使用

class ModelB: ModelA {
  // you can implement OR NOT the attributes here
}

从苹果文档:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

您可以定义协议的可选要求。这些要求不必通过符合协议的类型来实现。 可选要求以可选修饰符作为协议定义的一部分。 提供了可选要求,以便您可以编写与Objective-C互操作的代码。 协议和可选要求都必须使用@objc属性标记。 注意,@ objc协议只能被从Objective-C类或其他@objc类继承的类采用。 它们不能被结构或枚举采用。

但老实说,如果您想真正保持代码清晰,那并不是最好的方法。 抽象类没有明确定义谁将实现功能。 我不知道您最终想要达到什么目的,但是扩展可以帮助您将功能添加到某些类中,而无需事先在协议中定义它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM