![](/img/trans.png)
[英]java- trying to use/convert interface for use with/in place of an abstract class
[英]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成员” ,实际上您ModelA
在ModelB
实现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
}
从苹果文档:
您可以定义协议的可选要求。这些要求不必通过符合协议的类型来实现。 可选要求以可选修饰符作为协议定义的一部分。 提供了可选要求,以便您可以编写与Objective-C互操作的代码。 协议和可选要求都必须使用@objc属性标记。 注意,@ objc协议只能被从Objective-C类或其他@objc类继承的类采用。 它们不能被结构或枚举采用。
但老实说,如果您想真正保持代码清晰,那并不是最好的方法。 抽象类没有明确定义谁将实现功能。 我不知道您最终想要达到什么目的,但是扩展可以帮助您将功能添加到某些类中,而无需事先在协议中定义它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.