2013-08-12 2 views
0

Objective-C는 추상 클래스를 지원하지 않지만 그럼에도 OO 언어 (http://en.wikipedia.org/wiki/Objective-C)라는 것을 알고 있습니다. 그래서 저는 하나를 제외하고는 같은 메소드를 가진 여러 객체를 가지고 있습니다. DRY 원칙을 따르고 여러 클래스에서 동일한 코드를 반복하지 않아도됩니다. 가장 좋은 방법은 무엇입니까?객관적인 C에서 "템플릿 메서드 패턴"구현

+0

일반적인 수퍼 클래스가 올바른 해결책으로 보입니다. –

+1

.... ** 추상 수퍼 클래스 **로도 알려져 있습니다. 그러한 패턴의 가장 널리 사용되는 예 중 하나 인 클래스 클러스터를 참조하십시오. – bbum

+0

감사합니다. 내가 듣기를 기대했던 것입니다. – pvllnspk

답변

1

그래서 하나의 메소드를 제외하고는 여러 객체가 있으므로 DRY 원칙을 따르고 한 곳에서 동일한 코드를 반복하지 않으려합니다.

나는 ""을 제외하고 같은 방법으로 여러 개의 숫자가 있다고 가정합니다.


그것은 당신이 모든 것에 대해 얼마나 공식적으로하고 싶은가에 달려 있습니다. 모든 메소드는 모두 기본 클래스로 시작합니다. 나는 그걸 @interface A : NSObject라고 부를 것이다. A

하위 클래스는 A

  • @interface A1 : A
  • @interface A2 : A

에서 독특한 방법을 필요로 하위 클래스는 내가 호출 상속 B

  • @interface B : A

런타임에 클래스 A의 개체가이 고유 한 메서드를 수행 할 수 있는지 테스트 할 수 있습니다.

A *a = ... 
if ([a respondsToSelector:@selector(uniqueMethod)]) 
    [(id)a uniqueMethod]; 

이 매우 비공식적 인 방법이며 다른 클래스가 고유의 방법을 구현하기 시작하면 향후 유지 보수 문제가 발생할 수 있습니다.

다른 옵션은 클래스 멤버십을 확인하는 것입니다.

A *a = ... 
if ([a isKindOfClass:[B class]]) 
    [(B *)a uniqueMethod]; 

이것은 여전히 ​​비공식적이지만 향후 변경 사항을보다 잘 보호합니다. A의 다른 인스턴스는 나중에 고유 한 메서드를 사용해야 할 수도 있지만 이후 B의 하위 클래스로 리팩토링해야하므로 향후 유연성이 제한됩니다.

공식적인 방법은 프로토콜입니다. AB에 대한 프로토콜을 작성하여 APBP이라고합니다. 그러면 AB의 인터페이스가 변경됩니다. @interface A : NSObject <AP>

  • @interface B : A <BP>
    • 이제 시험 적합성에 대한 문제가된다.

      A *a = ... 
      if ([a conformsToProtocol:@protocol(BP)]) 
          [(id<BP>)a uniqueMethod]; 
      

      이 보호하고 유연성을 허용하지만, 미래의 변화가 필요할 때 유지하기 위해 더 많은 작업이다.

      희망이 있습니다.