Java swift:如何使用协议代替抽象类?
我想知道如何使用协议代替抽象类。下面给出了使用抽象类编写的场景,我想在swift中使用协议实现该场景:Java swift:如何使用协议代替抽象类?,java,swift,protocols,abstract-class,Java,Swift,Protocols,Abstract Class,我想知道如何使用协议代替抽象类。下面给出了使用抽象类编写的场景,我想在swift中使用协议实现该场景: public abstract class ModelA { protected int productQuantity; protected String productUrl; } class ModelB extends ModelA { // I want to access ModelA members here } 我想使用swift中的协议实现上述功能。 任何帮助
public abstract class ModelA
{
protected int productQuantity;
protected String productUrl;
}
class ModelB extends ModelA
{
// I want to access ModelA members here
}
我想使用swift中的协议实现上述功能。
任何帮助都将不胜感激。这里是一个简单的示例,您还可以查看更多详细信息 |
下面是一个简单的例子,您还可以查看更多详细信息 |
议定书的执行应:
protocol ModelA {
// props
var productQuantity: Int { get set }
var productUrl:String { get set }
}
“我想在这里访问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
}
}
有关协议的更多信息,请检查。协议的实施应为:
protocol ModelA {
// props
var productQuantity: Int { get set }
var productUrl:String { get set }
}
“我想在这里访问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
}
}
有关协议的更多信息,请检查。您可以写以下内容:
@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类继承的。他们
不能被结构或枚举采用
但是老实说,如果你想让你的代码保持清晰,这并不是最好的方法。抽象类没有明确定义谁将实现函数或不实现函数。我不知道您最终想要实现什么,但也许扩展可以帮助您将函数添加到某些类中,而无需事先在协议中定义它们。您可以这样写:
@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类继承的。他们
不能被结构或枚举采用
但是老实说,如果你想让你的代码保持清晰,这并不是最好的方法。抽象类没有明确定义谁将实现函数或不实现函数。我不知道您最终想要实现什么,但也许扩展可以帮助您向某些类添加函数,而无需事先在协议中定义它们。
protocolmodela{var productQuantity:Int{get set}var productUrl:String{get set}}class ModelA:ModelA{var productQuantity:Int=10 var productUrl:String=“Some URl”}
协议模型a{var productQuantity:Int{get set}var productUrl:String{get set}}类模型b:ModelA{var productQuantity:Int=10 var productUrl:String=“Some URl”}
据我所知,协议在swift中作为接口工作。但这迫使我实现派生类中的所有属性或函数。如果我希望一个派生类中的某些属性和另一个派生类中的某些属性,该怎么办?我可以使用抽象类来实现。在swift中,您不能有可选的属性或方法然而,在协议中,您可以通过使其符合@objc来声明(有关更多信息,请访问-)。如果您想使用类1中的某些属性和类2中的某些属性,这意味着不应在协议中声明这些属性,或者只分配一些默认值而不使用它们。以您的示例为例,如果我在Shape协议中有另一个名为radius的变量和一个实现Shape to calcula的类圆“面积、周长和圆”类只需要半径、宽度和高度。我应该如何实现这一点?因为不建议使用可选属性,所以我不能使用它。您可以使用计算属性()对于相同的。在圆的情况下,半径=宽度=高度,其中半径是计算属性,因此您不需要声明另一个属性,而是可以将属性存储为radius。根据我所阅读的内容,协议在swift中用作接口。但这迫使我实现派生类中的所有属性或函数。如果我需要一些f一个派生类中的属性和另一个派生类中的某些属性?我可以使用抽象类实现。在Swift中,协议中不能有可选属性或方法,但可以通过使其符合@objc来声明(有关更多信息,请访问-)。如果您想使用类1中的某些属性和类2中的某些属性,这意味着不应在协议中声明这些属性,或者只分配一些默认值而不使用它们。以您的示例为例,如果我在Shape协议中有另一个名为radius的变量和一个实现Shape to calcula的类圆面积、周长和圆类只需要半径,既不需要宽度也不需要高度。我应该如何实现这一点?因为不建议使用可选属性,所以我不能使用它。您可以使用计算属性()进行相同的操作。对于圆,您的半径=宽度=高度,其中半径是计算属性,因此