두 개의 비슷한 클래스, MultiSlotBlock
및 SingleSlotBlock
이 있습니다. 그들은 많은 공통 코드를 공유하기 시작 했으므로 일부 리팩토링을 수행하고 일부 메소드를 새로운 수퍼 클래스로 가져 오도록 결정했습니다. Block
이라고합시다.풀 업 리팩토링, Objective-C
예 단순화 내가 끌어 방법, 지금 하나는 다음과 같습니다
// (Block.mm)
- (void)doACommonBehaviour
{
// .. does some stuff
[self doAUniqueBehaviour];
}
여기서 문제는 물론 내 슈퍼 클래스가이를 구현하지 않기 때문에 [self doAUniqueBehaviour]
경고를 보여주고 있다는 점이다 메소드를 호출 할 수 있습니다.
내가 생각한 두 가지 해결책은 나에게 큰 소리가 아닙니다. 하나는 지금과 같은 프로토콜 (나는 현재 그 일을하고있는 방식)를 사용하는 것입니다 : 다른 (이 경우에 많이있을 것입니다) 그냥 반환 내 슈퍼 클래스에 빈 메서드 본문을 가지고있다
// (Block.mm)
- (void)doACommonBehaviour
{
// .. does some stuff
if ([self conformsToProtocol:@protocol(UniqueBehaviourProtocol)])
{
id<UniqueBehaviourProtocol> block = (id<UniqueBehaviourProtocol>)self;
[block doAUniqueBehaviour];
}
}
doesNotRespondToSelector
.
내가 전략 패턴을 사용해야한다는 것에 뭔가 이상한 생각이 들지만, 나는 벗어날 수 있으며 구현 방법을 생각하지 못했습니다.
아이디어가 있으십니까? 감사.
편집 : doAUniqueBehaviour
이 모든 하위 클래스에 구현된다는 사실을 알고 있습니다. 이는 구현이 다를뿐입니다.
모든 하위 클래스가'doAUniqueBehaviour'를 구현한다는 사실을 알고 있다면 어떻게 될까요? 슈퍼 클래스에서이 메소드의 인터페이스를 제공하고 싶습니다. 구현이 아닙니다. – Sam
모두 구현 한 경우 수퍼 클래스 인 인터페이스와 구현에 추가하십시오. 그런 다음 모든 하위 클래스에서 독립적으로 재정의하십시오. – Dimitris
-doAUniqueBehaviour가 일부 하위 클래스에서 구현되었다고 가정했습니다. 모든 서브 클래스에 의해 구현되고있는 경우 (다른 방법으로도), 슈퍼 클래스에 의해 구현 될 필요가 있습니다. 그리고 나서 각 서브 클래스는이 메소드를 자체적으로 구현할 때 필요한 모든 작업을 수행합니다. 어떤 경우 든 프로토콜을 필요로하지 않거나 수퍼 클래스가 서브 클래스에서 수행 할 수있는 작업을 확인할 필요가 없습니다. – Dimitris