如何用各种继承参数覆盖函数 (Swift)
How can I override a function with various inherited arguments (Swift)
如何在 Swift 中用继承的参数覆盖函数?
我有class个:
class ItemA {
var valueA: String?
func setValueA(_ value: String?) {
valueA = value
}
}
class ItemB: ItemA {
var valueB: String?
func setValueB(_ value: String?) {
valueB = value
}
}
// Analog of the abstract class
class ClassA {
func setValues(_ item: ItemA) {
item.setValueA("valueA")
getValues(item) // call getValues from ClassB
}
func getValues(_ item: ItemA) {
abort()
}
}
class ClassB: ClassA {
override func setValues(_ item: ItemB) { // item have type itemB, but extends ItemA
item.setValueB("valueB")
super.setValues(item)
}
override func getValues(_ item: ItemA) {
let item = item as! ItemB
let array = [item.valueA, item.valueB]
print(array)
}
}
我的目标是获得以下结果:
let itemB = ItemB()
ClassB().setValues(itemB)
// print ["valueA", "valueB"]
我无法覆盖 class 中的函数,因为类型不同并且 Swift 中没有类型继承。我在 ClassB
:
的 setValues(_ item: ItemB)
方法中得到这个错误
Method does not override any method from its superclass
在Java中,这可以使用抽象class和可扩展类型来实现:
abstract class ClassA {
<T extends ItemA> void setValues(T item) {
item.setValueA("valueA");
getValues(item);
}
abstract void getValues(MainItem item);
}
ClassB.setValues
不能接受类型为 ItemB
的参数(即使它是 ItemA
的子类),因为这样做会违反 Liskov 替换原则。
ClassB
个实例需要能够执行 ClassA
个实例可以执行的任何操作。其中一项要求是接受其 setValues
方法的 ItemA
参数。否则,这段代码会发生什么?
let classAInst: ClassA = ClassB()
classAInstance.setValues(ItemA())
正确答案取决于泛型:
class ItemA {
var valueA: String?
func setValueA(_ value: String?) {
valueA = value
}
}
class ItemB: ItemA {
var valueB: String?
func setValueB(_ value: String?) {
valueB = value
}
}
// Analog of the abstract class
class ClassA {
func setValues<T : ItemA>(_ item: T) {
item.setValueA("valueA")
getValues(item) // call getValues from ClassB
}
func getValues(_ item: ItemA) {
abort()
}
}
class ClassB: ClassA {
override func setValues<T : ItemB>(_ item: T) {
// item have type itemB, but extends ItemA
item.setValueB("valueB")
super.setValues(item)
}
override func getValues(_ item: ItemA) {
let item = item as! ItemB
let array = [item.valueA, item.valueB]
print(array)
}
}
检查一下!如果你想打印非可选值,打开它们。
let itemB = ItemB()
ClassB().setValues(itemB)
// print ["valueA", "valueB"]
如何在 Swift 中用继承的参数覆盖函数?
我有class个:
class ItemA {
var valueA: String?
func setValueA(_ value: String?) {
valueA = value
}
}
class ItemB: ItemA {
var valueB: String?
func setValueB(_ value: String?) {
valueB = value
}
}
// Analog of the abstract class
class ClassA {
func setValues(_ item: ItemA) {
item.setValueA("valueA")
getValues(item) // call getValues from ClassB
}
func getValues(_ item: ItemA) {
abort()
}
}
class ClassB: ClassA {
override func setValues(_ item: ItemB) { // item have type itemB, but extends ItemA
item.setValueB("valueB")
super.setValues(item)
}
override func getValues(_ item: ItemA) {
let item = item as! ItemB
let array = [item.valueA, item.valueB]
print(array)
}
}
我的目标是获得以下结果:
let itemB = ItemB()
ClassB().setValues(itemB)
// print ["valueA", "valueB"]
我无法覆盖 class 中的函数,因为类型不同并且 Swift 中没有类型继承。我在 ClassB
:
setValues(_ item: ItemB)
方法中得到这个错误
Method does not override any method from its superclass
在Java中,这可以使用抽象class和可扩展类型来实现:
abstract class ClassA {
<T extends ItemA> void setValues(T item) {
item.setValueA("valueA");
getValues(item);
}
abstract void getValues(MainItem item);
}
ClassB.setValues
不能接受类型为 ItemB
的参数(即使它是 ItemA
的子类),因为这样做会违反 Liskov 替换原则。
ClassB
个实例需要能够执行 ClassA
个实例可以执行的任何操作。其中一项要求是接受其 setValues
方法的 ItemA
参数。否则,这段代码会发生什么?
let classAInst: ClassA = ClassB()
classAInstance.setValues(ItemA())
正确答案取决于泛型:
class ItemA {
var valueA: String?
func setValueA(_ value: String?) {
valueA = value
}
}
class ItemB: ItemA {
var valueB: String?
func setValueB(_ value: String?) {
valueB = value
}
}
// Analog of the abstract class
class ClassA {
func setValues<T : ItemA>(_ item: T) {
item.setValueA("valueA")
getValues(item) // call getValues from ClassB
}
func getValues(_ item: ItemA) {
abort()
}
}
class ClassB: ClassA {
override func setValues<T : ItemB>(_ item: T) {
// item have type itemB, but extends ItemA
item.setValueB("valueB")
super.setValues(item)
}
override func getValues(_ item: ItemA) {
let item = item as! ItemB
let array = [item.valueA, item.valueB]
print(array)
}
}
检查一下!如果你想打印非可选值,打开它们。
let itemB = ItemB()
ClassB().setValues(itemB)
// print ["valueA", "valueB"]