2011-02-26 4 views
1

프로그램의 시작 부분에서 이미지의 비트 심도를 취하는 프로그램을 작성하고 있습니다. 일단 비트 깊이가 있으면 항상 8, 16 또는 32 비트 중 하나가되도록 보장됩니다. 비트 심도가 있으면 이미지에 대한 처리를 수행하고 출력을 기반으로 몇 가지 새로운 이미지를 만듭니다. 이미지를 만들려면 IE 클래스 FloatProcessor ShortProcessor ByteProcess와 해당 배열, float [] short [] 및 byte []를 사용해야합니다.시작 부분의 값을 기준으로 프로그램 전체에서 특정 개체 사용

내가 원하는 것은 스위치 나 여러개의 if 스위치 중 하나를 사용하여 어느 스위치를 사용해야하는지 결정하는 것입니다. 세 클래스는 모두 클래스의 확장입니다. 그러나 메소드에서 수행 할지라도 기본 클래스를 반환해야하며 어떤 유형을 사용했는지 알 수 없습니다.

편집 : 경우 (깊이 == 8) #DEFINE 유형 ByteProcessor 등 16, 32

답변

0

꼽은 말하기의,의 말을하자 라인을 따라 뭔가 내가 정말 원하는입니다 기본 TypeProcessor 클래스의 세 가지 상속 : 당신의 프로그램이 TypeProcessor 참조를 보유하는 경우, 당신은 할 수없는, 분명히

class ByteProcessor extends TypeProcessor{ 
    public byte data[]; 
    public Image ProcessImage(Image input) { 
     //do stuff 
     return ret; 
    } 
} 

:

abstract class TypeProcessor { 
    public abstract Image ProcessImage(Image input); 
} 

을, 당신은 특정 수업을 직접 data에 액세스하십시오. (유형 검사 및 캐스팅과 같은 작업을하지 않아도됩니다.)

적절한 해결책은 클래스 자체에 data에 액세스하는 데 필요한 코드를 이동하는 것입니다 :

class ByteProcessor extends TypeProcessor{ 
    public byte data[]; 
    public Image ProcessImage(Image input) { 
     //do stuff 

     data = whatever; 

     FrobData 

     Image ret = new Image(data); 

     return ret; 
    } 

    void FrobData() { 
     for(i = 0; i < data.length; i++) { 
      data[i] = (data[i] + 1) % 64; 
     } 
    } 
} 

이 분명 인위적인 매우 잘못된 예입니다,하지만 그것은 당신에게 일반적인 아이디어를 줄 것이다.

이것은 약간의 코드 중복성을 소개 할 것이지만, 더 복잡한 솔루션을 보증하지 않기 위해 계산이 서로 다른 유형으로 충분하다고 가정합니다.

+0

문제는 플러그인을 작성하고있어이 클래스가 기본 프로그램 라이브러리에서 나옵니다. 지금 당장 완벽하게 작동하는 것은 #define입니다. – Tanner

1

상속 대신 Generics를 사용하는 것은 어떻습니까? 내 자바는 녹슨, 그래서 보여주기 위해 C++를 사용합니다 :

template<class DataT> 
class Foo 
{ 
    public: 

     DataT data 

     void processData() 
     { 
      // Do something here 
     }; 
}; 

당신은 여전히 ​​당신은 여전히 ​​당신의 코드를 통해 모두 넣어하는 것을 피하기 것 processData 기능에 스위치 문을 필요로합니다. factory method pattern과 함께 제네릭을 사용하면 원하는 것을 얻을 수 있습니다.

관련 문제