Java 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中的协议实现上述功能。 任何帮助

我想知道如何使用协议代替抽象类。下面给出了使用抽象类编写的场景,我想在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的类圆面积、周长和圆类只需要半径,既不需要宽度也不需要高度。我应该如何实现这一点?因为不建议使用可选属性,所以我不能使用它。您可以使用计算属性()进行相同的操作。对于圆,您的半径=宽度=高度,其中半径是计算属性,因此