iOS 클래스 패밀리(클래스 클러스터)
클래스
'류족'은 매우 유용한 모델(pattern)으로'추상적인 기류'배후의 실현 세부 사항을 숨길 수 있다.예를 들어 UIKit 프레임워크의 UIButton 종류.버튼을 만들려면 다음과 같은 클래스 메서드를 호출해야 합니다.
+ (instancetype)buttonWithType:(UIButtonType)buttonType;
이 방법이 되돌아오는 대상은 들어오는 단추 형식 (button type) 에 달려 있습니다.그러나 어떤 유형의 대상이 되돌아오든지 간에 그들은 같은 기본 클래스인 UIButton을 계승한다.이렇게 하는 의미는 UIButton류의 사용자들은 만들어진 단추가 구체적으로 어느 하위 클래스에 속하는지, 단추의 그리기 방식 등 세부 사항을 고려하지 않아도 된다는 것이다.사용자는 단추를 만드는 방법,'제목'(title)이라는 속성을 설정하는 방법, 터치 동작의 목표 대상을 늘리는 방법 등 문제를 이해하기만 하면 된다.
- (void)drawRect:(CGRect)rect {
if (_type == TypeA) {
//Dram TypeA button
} else if (_type == TypeB) {
//Draw TypeB button
}
}
우리는 위 코드가 쓴 것처럼 각종 단추의 그리기 논리를 하나의 클래스에 넣고 단추 유형에 따라 전환할 수 있다.그러나 버튼 형식에 따라 전환해야 하는 그리기 방법이 여러 가지가 있다면 번거로워질 것이다.이때 가장 좋은 방법은 각종 단추가 사용하는 그리기 방법을 관련 하위 클래스에 넣는 것이다.그러나 이렇게 하면 이 종류를 사용하는 사용자에게 문제가 하나 있을 수 있다. 바로 그가 이 종류의 하위 클래스가 몇 개인지 모를 수도 있고 사용하는 것은 말할 것도 없다.이때'류족 모델'을 사용해야 한다. 이 모델은 여러 종류에 유연하게 대응하고 그들의 실현 세부 사항을 추상적인 기류 뒤에 숨겨 인터페이스가 간결하도록 한다.사용자는 스스로 하위 클래스의 실례를 만들 필요가 없고, 기본 클래스 방법으로 만들기만 하면 된다.
클래스 패밀리 생성
가령 직원을 처리하는 유형이 있다면 모든 직원은'이름'과'월급'이라는 두 가지 속성을 가지고 관리자는 일상적인 업무를 수행하도록 명령할 수 있다.그러나 직원들의 업무 내용은 다르다.사장은 직원들을 이끌고 프로젝트를 할 때, 모든 사람이 자신의 일을 어떻게 완성하는지에 관심을 가질 필요가 없고, 단지 착공만 지시하면 된다.추상 기본 클래스 EOCEmployee 정의
EOCEmployee.h
typedef NS_ENUM(NSUInteger, EOCEmployeeType) {
EOCEmployeeTypeDeveloper,
EOCEmployeeTypeDesigner,
EOCEmployeeTypeFinance
};
@interface EOCEmployee : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger salary;
//Helper for creating Employee objects
+ (EOCEmployee *)employeeWithType:(EOCEmployeeType)type;
//Make Employees do their respective day's work
- (void)doDaysWork;
@end
EOCEmployee.m
@implementation EOCEmployee
+ (EOCEmployee *)employeeWithType:(EOCEmployeeType)type {
switch (type) {
case EOCEmployeeTypeDeveloper:
return [EOCEmployeeDeveloper new];
break;
case EOCEmployeeTypeDesigner:
return [EOCEmployeeDesigner new];
break;
case EOCEmployeeTypeFinance:
return [EOCEmployeeFinance new];
break;
}
}
- (void)doADaysWork {
//Subclasses implement this
}
@end
EOCEmployee의 하위 클래스를 정의합니다. EOCEmployee Developer의 경우
EOCEmployeeDeveloper.h
@interface EOCEmployeeDeveloper : EOCEmployee
@end
EOCEmployeeDeveloper.m
@implementation EOCEmployeeDeveloper
- (void)doADaysWork {
[self writeCode];
}
@end
본 예에서 기본 클래스는'클래스 방법'을 실현했는데 이 방법은 창설될 직원 클래스에 따라 대응하는 직원 실례를 잘 분배한다.이런'공장 모델'은 유족을 창설하는 방법 중의 하나다.OC라는 언어에서 어떤 기류가'추상적'이라는 것을 가리킬 수 없다.그래서 개발자는 보통 문서에 클래스의 사용법을 명확하게 쓴다.이러한 상황에서 기본 인터페이스는 일반적으로 init라는 구성원 방법이 없습니다. 이것은 이 종류의 실례가 사용자가 직접 만들어서는 안 된다는 것을 암시합니다.사용자가 기본 클래스의 실례를 사용하지 않도록 하는 또 다른 방법은 기본 클래스의doAdaysWork 방법에서 이상을 제거하는 것이다.그러나 이런 방법은 상당히 극단적이어서 매우 적은 사람이 사용한다.만약 대상이 속한 클래스가 특정한 클래스에 위치한다면 그 내면 정보를 조회할 때 조심해야 한다.너는 자신이 어떤 종류의 실례를 만들었다고 생각할 수 있지만, 실제로는 그 하위 종류의 실례를 만들었다.Employye 이 예에서 [employye is Member OfClass: [EOC Employee class]]는 NO로 돌아간다. 왜냐하면employye는 EOC Employee 종류의 실례가 아니라 그 하위 클래스의 실례이기 때문이다.
코코아의 유족
시스템 프레임워크에는 많은 종류족이 있다.대부분의 컬렉션 클래스는 클래스입니다. 예를 들어 NSArray와 가변 버전의 NSMutable Array입니다.
id maybeAnArray = /* ... */;
if ([maybeAnArray class] == [NSArray class]) {
// Will never be hit
}
위의 이 코드if문장은 영원히 진실이 될 수 없다.[maybeAnArray class] 되돌아오는 클래스는 NSArray 자체가 될 수 없습니다. NSArray의 초기화 방법으로 되돌아오는 실례의 유형은 클래스 공공 인터페이스 뒤에 숨겨진 내부 유형이기 때문입니다.만약 우리가 어떤 대상이 클래스족에 있는지 판단하려면 두 개의'클래스 대상'이 같은지 직접 검사하지 말고 아래의 코드를 사용해야 한다.
id maybeAnArray = /* ... */;
if ([maybeAnArray isKindOfClass:[NSArray class]]) {
// Will be hit
}
우리는 종종 클래스족에 실체 서브클래스를 추가해야 하지만, Employee라는 예에서 '공장 방법' 의 원본 코드가 없으면 그 중에서 직원 클래스를 추가할 수 없다.그러나 코코아에서 NSArray와 같은 유족에게 하위 유족을 추가하는 방법은 있지만 몇 가지 규칙을 준수해야 한다
4
4
4
참고 문헌: [1] Matt Galloway.Effective Objective-C 2.0[M].북경:기계공업출판사,2015:35-39
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.