2017-10-03 9 views
0

의 다른 유형이라는 한 가지 유형의 인스턴스를 만드는 방법 : 다음과 같은 제품 클래스를 생성하는 데 사용OOP - 나는 두 추상적 제품 유형이 이유

type abstractProductA = {. 
    methodA: string 
}; 

type abstractProductB = {. 
    methodB: int 
}; 

:

class productA1 = { 
    pub methodA => "This is methodA of ProductA1"; 
}; 

class productB1 = { 
    pub methodB => 1; 
}; 

나는 것을 추상적 인 공장에서 abstractProductA뿐만 아니라 abstractProductB의 인스턴스를 호출하려고합니다. 다음과 같은 뭔가 (구문 알아, 꺼짐) :

그래서
type abstractFactory = {. 
    createProductA: abstractProductA, 
    createProductB: abstractProductB 
}; 

그 나는 다음 클래스 사용하여 새 concreteFactory 만들 때 :

class concreteFactory1 = { 
    pub createProductA => (new productA1); 
    pub createProductB => (new productA1); 
}; 

및 constructer :

let g = new concreteFactory1#createProductB; 
Js.log (g#methodA); 

을 컴파일러는 createProductB가 int가 아니라 (현재는 그렇지 않은) 문자열을 취하지 않는다고 불평해야합니다.

감사합니다. 어떤 제안이든지 환영합니다.

+1

질문이 이해가 가지 않습니다. 이름이 다른 두 개의 메소드가있는 경우 컴파일러는 유형을 확인하기 전에 이름을 확인하고 그에 대한 불평을합니다. 그렇지 않은 경우 어떤 유형을 검사 할 것입니까? – glennsl

+0

glennsl 정말 고맙습니다. 다시 잠깐 살펴보고 다시보고하겠습니다. –

+0

@glennsl 질문이 업데이트되었습니다. concreteFactory1에 대한 createProductB 메소드가 문자열을 사용하지만 abstractFactory 유형을 따르는 경우 이상적으로 컴파일러에서 오류가 발생하면 createProductB는 문자열이 아닌 int 만 반환 할 수 있습니다. 그것은 내가 성취하려는 것입니다. 양해 해 주셔서 감사합니다. –

답변

1

createProductBproductB1 대신 productA1을 반환하는 경우 오류가 발생하는 것으로 보입니다. 이를 달성하기 위해서는 객체 유형 대신 abstractFactory에 대한 가상 클래스를 정의한 다음 concreteFactory에 명시 적으로 상속해야합니다.

class virtual abstractFactory = { 
    pub virtual createProductA: abstractProductA; 
    pub virtual createProductB: abstractProductB; 
}; 

class concreteFactory1 = { 
    inherit abstractFactory; 
    pub createProductA => (new productB1); 
    pub createProductB => (new productB1); 
}; 

pub createProductA => (new productB1)에 다음과 같은 오류가 발생합니다 :

이 표현은 productB1을 입력 가지고 있지만 두 번째 오브젝트 유형이있는 방법 methodB

참조가 없습니다 abstractProductA 표현은 유형 예상 해당 full example here