2011-05-10 2 views
0

모든 고객 (ex id, name, surname)간에 공유되는 일부 속성이있는 Customer이라는 추상 클래스가 있습니다.추상 클래스 및 상속에 대한 질문

그런 다음 나는 그런 (높이, 폭), MidPriorityCustomers 등 특별한 고유의 필드가 같은 PriorityCustomers 적은 수업을

내가 할 때 :

Customer customer = new PriorityCustomer(); 

나는 우선 고객에 액세스 할 수 없습니다 행동 양식. 내가 다른 방식으로 그것을 시도 할 때 나는 추상 클래스를 인스턴스화 할 수 없다.

나는 모든 고객을 골치 덩어리로 처리하고 싶기 때문에 이것을 사용하고 있습니다. 특별한 도움이 필요한 사람들 만 특별하게 처리합니다.

따라서 내 방법은 Customer 유형을 반환합니다. 나는 여기 디자인으로 잘못된 결정을 내리고 있는가? 아무도 제안 할 수 있습니까? (내가 특별한 고객 클래스에서 그와 arround를 다른 방법이없는 부모님 추상 클래스에있는

필드 Customer 클래스에는 높이, 폭,하지만 그 :.

를 언급하는 것을 잊었다 없다 PriorityCustomers 클래스에 있음)

답변

4

특정 프로세스를 원할 때 수퍼 프로세스 메서드가있는 것처럼 들립니다.

abstract class Customer { 
    public abstract returnType process(args); 
} 

class PriorityCustomer extends Customer { 
    public returnType process(args) { 
     // process PriorityCustomer 
    } 
} 

class MidPriorityCustomer extends Customer { 
    public returnType process(args) { 
     // process MidPriorityCustomer 
    } 
} 

은 모든 당신이 의지는 각 고객 유형이 무엇을 필요로하는지 특수 처리 알고있는 모든 고객 유형을 처리 할 수 ​​있습니다

for(Customer customer: customers) 
    customer.process(args); 

입니다해야합니다.

3

참조는 고객 개체에 대한 것이므로 고객의 메서드 만 볼 수 있습니다. PriorityCustomer의 메소드를 호출하려면 PriorityCustomer 유형의 참조를 만들어야합니다. PriorityCustomer는 다음 고객 개체의 메소드를 오버라이드 (override) 코드를 사용하기위한

PriorityCustomer customer = new PriorityCustomer(); 

을 특정 행동을 원하는 경우 :

Customer customer = new PriorityCustomer(); 

그렇다면 고객이 당신이 PriorityCustomer에 메서드를 호출해야 할 경우 당신은 할 필요가 processOrder()이라는 메서드를 사용하면 PriorityCustomer에서 재정의 할 수 있습니다. 다형성이 시작되면 고객 참조에서 processOrder()으로 전화를 걸면 PriorityCustomer에서 실행될 메소드가됩니다. 이것이 하위 클래스에 다른 동작을 부여하는 방법이지만 코드에서 수퍼 클래스 참조 만 사용하십시오.

0

일반적인 기본 클래스를 사용한다는 생각은 모든 고객의 공통 기능을 한 클래스에 그룹화하고 그 위에 특정 유형의 고객을 구축하는 것입니다. PriorityCustomer 특정 속성에 액세스하고 PriorityCustomer 인스턴스가 있다고 확신하는 경우 캐스트를 수행 할 수 있습니다.

float height = ((PriorityCustomer)customer).height; 
1

변수를 수퍼 클래스로 선언하면이 변수를 인스턴스화하는 데 사용되는 모든 자식을 사용할 수 있다는 장점이 있습니다.

단점은 선언 된 클래스의 인터페이스로 제한된다는 것입니다. 명시 적으로 PriorityCustomer에 고객을 시전 할 수 있지만, 당신은 안전 확인하기 위해 instanceof를 사용한다 :

Customer customer = new PriorityCustomer(); 
if (customer instanceof PriorityCustomer) { 
    height = ((PriorityCustomer)customer).getHeight(); 
} 

을 이렇게 요약 : 당신이 일반적으로 사용할 필요가 어떤 클래스와 변수를 선언 할 것입니다. 명시 적 형변환을 많이하는 경우 클래스 구조를 다시 생각해 볼 수 있습니다.

0

당신은 분명히 이것은 인위적인 예입니다 이와 관련

Customer customer = new PriorityCustomer(); 
if (customer instanceof PriorityCustomer) { 
    ((PriorityCustomer)customer).somePriorityCustomerSpecificMethod(); 
} 

에 도움 instanceof를 사용할 수 있습니다.

0
public Customer getTheCustomer() { 
    // return one of the subclasses of Customer 
} 
.... 


Customer c = getTheCustomer(); 
if (c instanceof PriorityCustomer) { 
    PriorityCustomer pc = (PriorityCustomer) c; 
    // do something with pc 
} else if (c instanceof MidPriorityCustomer) { 
    MidPriorityCustomer mpc = (MidPriorityCustomer) c; 
    // do something with mpc 

... et cetera ... 
관련 문제