2016-09-23 2 views
1

적절한 클래스의 객체를 얻기 위해 (나는 다른 개체가 다음 사람이 더 복잡 제기 드롭 단순화) :신속한 상속 문제. 어떻게 두 개의 클래스가

class Person 
{ 
    var name: String = "Default name" 

    init(object: PersonEntity) 
    { 
    name = object.daysMask 
    } 
} 

class Employer: Person 
{ 

} 

나는 사람

func getConiguratedPerson(name: String) -> Person 
{ 
    let person = Person() 
    person.name = name 
} 
에게 나를 위해 구성 기능을 가지고

let person = getConiguratedPerson("Alex") 

하지만 내가 필요로하는 경우: 경우

나는 Person 나는 간단하게이 작업을 수행 얻으려면대신 나는 우리가 간단하게이 작업을 수행 할 수 있습니다 오브젝티브 C에서뿐만 아니라

let employer = getConiguratedPerson("Alex") // returns Person as expected but need to have employer instead. 

이 기능을 사용하려면 :

Employer *employer = Employer([self getConiguratedPerson:"Alex"]) if I remember. 

답변

2

실수가 getConfiguredPerson 기능입니다. 당신은 이니셜 라이저를 원한다. 초기화 프로그램은 자신이 원하는 클래스를 반환합니다.

class Person { 
    var name: String = "Default name" 

    init(name: String) { 
     self.name = name 
    } 

    init(object: PersonEntity) { 
     self.init(object.daysMask) 
    } 
} 

class Employer: Person {} 

이제 그냥 Person(name: "Alex")을 사용하고 Employer(name: "Alex")를 사용하는 고용주를 얻기 위해, 사람을 만들 수 있습니다.

ObjC에서도 마찬가지입니다. 거기에 getConfiguredPerson도 없어야합니다. [Person initWithName:]이 있어야합니다.

+0

감사하지만, 만드는 방법 팩토리 메소드 그때? 팩토리 메서드 패턴과 비슷한 메서드가 필요하지 않으면. 또는 예를 들어 인덱스 경로에있는 행의 셀도 UITableViewCell을 반환하지만 원하는 경우 임의의 셀을 구성 할 수 있습니다. –

+0

cellForRow의 경우 일반적으로 제네릭과 as가 모두 필요합니다! 캐스트. 가장 일반적인 경우 "Self를 반환하는 클래스"는 상속 문제로 인해 클래스에서 가능하지 않습니다 ("Self를 반환하는 프로토콜"을 검색하면 그에 대한 많은 논의가 나와 있습니다). 어떠한 경우에도 일반적인 대답은 없습니다. 당신이하고자하는 일을 다루는 분명한 질문이 필요합니다. 설명하는 경우 init이 정확합니다. 어떤 특정 문제에 대해 공장을 원하십니까? –

+0

특히, 대부분의 코드에서 원하는 셀을 구성 할 수 없습니다. 어떤 종류의 셀을 반환하는지 알 필요가 있습니다 (그렇지 않으면 어떻게 구성합니까?). 알고 있다면 일반적으로 제네릭이 답입니다. –

0

구성된 사람이 Employee 유형이 아니고 Person 유형이므로 여기에서 상영 중계를 사용할 수 없습니다. 원하는 결과를 달성하기 위해 나는이 같은 제안 :

class Person { 
    var name = "name" 

    required init() { } 
} 

class Employee: Person { } 

func getPerson<T: Person>(name: String) -> T { 
    let person = T() 
    person.name = name 
    return person 
} 

let employee: Employee = getPerson("Alex") 

또는이 팩토리 메소드에 의해 반환 객체의 타입 입력에 의존하는 경우 : 당신의 대답에 대한

func getPerson(name: String) -> Person { 
    if name != "Alex" { 
     return Person() 
    } 

    return Employee() 
} 

let employee = getPerson("Alex") as! Employee 
관련 문제