isKindOfClass:を呼び出してクラスのタイプを確認するか、respondsToSelector:を介して探しているメソッドをサポートしているかどうかを確認するだけで「ダックタイピング」アプローチを採用する方が適切ですか?
これが私が考えているコードで、両方の方法で書かれています。
for (id widget in self.widgets)
{
[self tryToRefresh:widget];
// Does this widget have sources? Refresh them, too.
if ([widget isKindOfClass:[WidgetWithSources class]])
{
for (Source* source in [widget sources])
{
[self tryToRefresh:source];
}
}
}
または:
for (id widget in self.widgets)
{
[self tryToRefresh:widget];
// Does this widget have sources? Refresh them, too.
if ([widget respondsToSelector:(@selector(sources))])
{
for (Source* source in [widget sources])
{
[self tryToRefresh:source];
}
}
}