关于 swift 父类如何获取子类属性的问题

2014-06-05 00:31:38 +08:00
 stonestyle
被一个父类获取子类属性的方法搞伤心了,求指导

父类 A 有个方法 match(another a: A) 参数是A的实例
子类B继承A,添加新的属性bb,并且覆盖A的match方法,match(another a: A)
match方法中用到 a.bb 提示 'A' does not have a menber named 'bb'
查了官方文档继承和覆盖章节,没找到答案,求资深swifter指导
6323 次点击
所在节点    Swift
7 条回复
xuming
2014-06-05 01:03:53 +08:00
a的类型是A,怎么会有bb属性呢?
在代码里把 a 强制转换成B类型,或许可以。

貌似,父类获取子类属性,不是好习惯。
SoloCompany
2014-06-05 01:07:56 +08:00
「资深swifter」楼主是来搞笑的吗
Channing
2014-06-05 01:16:00 +08:00
if let b = a as? B {
// Do something with b.bb
}

这种情况已经属于设计失误了,新添加一个matchB而不是直接override比较好。
stonestyle
2014-06-05 09:15:53 +08:00
@xuming
@Channing
确实是我的设计失误,不习惯OOP

@SoloCompany 一点幽默感都没呢..
thuai
2014-06-05 09:18:34 +08:00
@xuming 同意。强转是一个办法。@stonestyle 你无法确定传入的A就一定是B的对象。也有可能是同样继承A的C对象,C中没有bb。你怎么玩?
jsonline
2014-06-05 09:42:05 +08:00
父类获取子类属性?一听就不科学。
SoloCompany
2014-06-06 00:27:24 +08:00
你可以参考一下,这是 jetbrains 家的 IDE 在 java 语言为一个 class 自动生成的 equals 方法
在这种场景下,一切什么不建议强制转换的设计指引都是浮云,不存在什么优雅的方法

~~~ java
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof OOXX)) return false;

OOXX ooxx = (OOXX) o;

if (!id.equals(ooxx.id)) return false;
if (data != null ? !data.equals(ooxx.data) : ooxx.data != null) return false;

return true;
}
~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/115857

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX