gpt4 book ai didi

swift - 如何使用共享代码为更有限版本的类建模?

转载 作者:行者123 更新时间:2023-11-28 13:27:58 25 4
gpt4 key购买 nike

我需要创建一个新类。它的一些功能已经在另一个类中,从领域的角度来看,从它继承是有意义的。问题是有一个方法必须在其参数类型上有更多限制,因为 LSP(Liskov 替换原则)你不能覆盖它。

到目前为止,我可能会更改代码,

为了更好的解释让我举一个简单的例子:

我有 AnimalShelter,我需要实现 DogShelter

class AnimalShelter {
func usefulMethod(...) {}

func take(x: Animal) {}
}

class DogShelter {
var dogMedianCuteness: String = "normal (= very cute)"

func usefulMethod(...) {}

func take(x: Dog) {}
}

方案一:子类

如果 DogShelterAnimalShelter 的子类,那么它将免费获得 usefulMethod(...),但是继承的方法 take(x: Animal) 不能被覆盖并污染 DogShelter 的 API,应该什么都不做或抛出错误。

class AnimalShelter {
func usefulMethod(...) {}

func take(x: Animal) {}
}

class DogShelter: AnimalShelter {
var dogMedianCuteness: String = "normal (= very cute)"

func take(x: Dog) {}
}

方案二:协议(protocol)+协议(protocol)扩展

如果 AnimalShelterDogShelter 实现一个协议(protocol),从域的角度来看它并不精确,但是共享代码 usefulMethod(...) 可以在协议(protocol)扩展中实现。

protocol UsefulThing {
func usefulMethod(...)
}

extension UsefulThing {
func usefulMethod(...) { ... }
}

class AnimalShelter: UsefulThing {
func take(x: Animal) {}
}

class DogShelter: UsefulThing {
var dogMedianCuteness: String = "normal (= very cute)"

func take(x: Dog) {}
}

解决方案3:泛化,创建另一个父类(super class)

问题出在 take(x: T) 方法上,它在 DogShelter 中更为专业。将它从 AnimalShelter 中移除将允许继承而不会出现问题,但是到目前为止使用 AnimalShelter 的所有内容都必须由一个新的子类 AnyAnimalShelter: AnimalShelter 替换,它有问题的 take(x: Animal) {}

class AnimalShelter {
usefulMethod(...) {}
}

class AnyAnimalShelter: AnimalShelter {
take(x: Animal) {}
}

class DogShelter: AnimalShelter {
var dogMedianCuteness: String = "normal (= very cute)"

func take(x: Dog) {}
}

解决方案 4:组合

从域的角度来看,继承确实有意义,因此老板认为最好保留。


所以我从 AnimalShelter 获得了代码并被允许更改它,尽管它会引起人们的注意,为什么我会更改运行多年的完美代码。我需要一个关于 take(x: Animal) 方法在 AnimalShelter 中有缺陷的抽象原因。不仅要有充分的理由反对它,还要在以后的类(class)中避免它。

如果我无法更改使用 AnimalShelterAnimalShelter 本身的代码,那将是一个真正的问题。

问题

某人/我应该如何建模?

最佳答案

您可以使用具有关联类型的协议(protocol):

protocol Shelter {
associatedtype AnimalType

func take(x: AnimalType)
}

extension Shelter {
func usefulMethod(...)
}

class AnimalShelter : Shelter {
typealias AnimalType = Animal
func take(x: Animal) { ... }
}

class DogShelter : Shelter {
typealias AnimalType = Dog
var dogMedianCuteness: String = "normal (= very cute)"
func take(x: Dog) {}
}

关于swift - 如何使用共享代码为更有限版本的类建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58010575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com