- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要创建一个新类。它的一些功能已经在另一个类中,从领域的角度来看,从它继承是有意义的。问题是有一个方法必须在其参数类型上有更多限制,因为 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) {}
}
如果 DogShelter
是 AnimalShelter
的子类,那么它将免费获得 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) {}
}
如果 AnimalShelter
和 DogShelter
实现一个协议(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) {}
}
问题出在 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) {}
}
从域的角度来看,继承确实有意义,因此老板认为最好保留。
所以我从 AnimalShelter
获得了代码并被允许更改它,尽管它会引起人们的注意,为什么我会更改运行多年的完美代码。我需要一个关于 take(x: Animal)
方法在 AnimalShelter
中有缺陷的抽象原因。不仅要有充分的理由反对它,还要在以后的类(class)中避免它。
如果我无法更改使用 AnimalShelter
或AnimalShelter
本身的代码,那将是一个真正的问题。
某人/我应该如何建模?
最佳答案
您可以使用具有关联类型的协议(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/
我有一个关于复杂性的简单问题。我在 Java 中有这段代码: pairs是 HashMap包含 Integer作为键,它的频率为 Collection作为一个值。所以: pairs = new Has
对于我的应用程序,我需要在 Coq 中使用和推理有限映射。谷歌搜索我发现 FMapAVL 似乎非常适合我的需求。问题是文档很少,我还没有弄清楚我应该如何使用它。 作为一个简单的例子,考虑以下使用对列表
我有一个主表tblAssetMaster A和一个移动表tblMovement M。 我想提取所有 Assets 及其当前位置,因此需要获取每个 Assets 的最新移动条目。 字段 A: Asset
我想让我的网站内容居中,但仅限于网页的特定宽度。所以当它超过 500px 时,我希望内容被修复,无法进一步拉伸(stretch)。无论如何都要这样做,还是我最好把所有东西都修好?希望有意义的是添加一些
我正在尝试批量删除 Backbone 模型的集合,如下所示...... collection.each(function(model, i){ model.destroy(); }); 我发现当每
我想要一个软件环境,在其中我可以在具有特定资源的硬件上测试我的软件的速度。例如,当我的主机硬件是具有 12GB RAM 的 3GHz 四核 amd64 时,该程序在具有 24 Mb RAM 的 800
在 Eclipse 中,我得到了 BigInteger.valueOf(2).pow(31093) 的值,但没有得到 BigInteger.valueOf(2).pow(31094) 的值(它是空的)
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
我想将 2 个表从本地 sql server 2000 上传到托管的 mysql。第一个表有 17 列和 680 行,其他 10 列和 8071 行。 我首先使用 xampp mysql 尝试离线,它
我在 S3 中自动生成并保存了静态 html 文件。有时文件大小达到 2mb。是否可以使用javascript来获取html文件的一部分,显示它,当用户到达页面底部时,获取下一部分等等? 最佳答案 X
我是一名优秀的程序员,十分优秀!