2012-01-22 2 views
-1

매개 변수로 전달할 때 4 가지 종류의 클래스에 대해 동일한 작업을 수행하는 메서드가 있습니다. 현재, 그 4 개의 클래스 모두에 대해 4 번 해당 메소드를 작성해야합니다. 예 :다른 개체를 같은 메서드로 동적으로 전달

doSomethingForClass1(MyClass1 myclass1, Address address); 
doSomethingForClass2(MyClass2 myclass2, Address address); 
doSomethingForClass3(MyClass3 myclass3, Address address); 
doSomethingForClass4(MyClass4 myclass4, Address address); 

이러한 모든 방법은 동일한 작업을 수행하고 동일한 개체를 반환합니다. 하나의 메소드로 통합하고 다른 객체를 전달하려면 어떻게해야합니까?

+0

클래스가 어떻게 관련되어 있는지, 메소드에서 무엇을하고 있는지 알지 못해도 말하기가 어렵습니다. 그러나 다형성과 제네릭 중 하나는 여기에서 도움이되어야합니다. – Perception

답변

1

가능한 해결책은 MyClassX 클래스가 모두 같은 수퍼 클래스 또는 인터페이스에서 확장 된 다음 수퍼 클래스 또는 인터페이스의 매개 변수를 사용하는 메서드를 만드는 것입니다. 즉 수퍼 을가집니다.

doSomethingForClass(MySuperType superType, Address address) { 
    // ... 
} 

하고있는 수업은 인터페이스

class MyClass1 implements MySuperType { 
    //.... 
} 

하고, ...

class MyClass2 implements MySuperType { 
    //.... 
} 

등 ...

이 작동하려면 doSomethingForClass(...) 방법은 수에게 공유 인터페이스 내에서 정의 된 메소드 만 호출하십시오.

1

만약 그들이 똑같은 일을한다면 그들은 어떻게 을 완전히 받아 들일 것인가? 다른 물건들? 이제

public MyClass1 implements MyClass {/*...*/} 
public MyClass2 implements MyClass {/*...*/} 
public MyClass3 implements MyClass {/*...*/} 
public MyClass4 implements MyClass {/*...*/} 

:에 의해 "이 같은 일을하고"경우에 당신은 모든 일반적인 방법을,는 MyClass? 모든 유형과 같은 공통 인터페이스/수퍼 클래스를 가져야한다 "정확히이 같은 방법은 호출 "를 수집하는 의미 다형성을 활용 : 수업의 4가 동일한 인터페이스를 구현할 수

doSomethingForClass(MyClass myclass, Address address); 
5

경우, 말, IMyClass는, 당신은 하나의 방법이있을 수 있습니다.

doSomethingForClass1(IMyClass myclass, Address address); 

이것은 가능하지 않거나 응용 프로그램에 이해가되지 않을 수도 있지만. 그러나 이것이 의미가있는 경우 인터페이스에 메서드를 추가하는 것도 고려하십시오. 예 :

public interface IMyClass { 
     public void doSomethingWithAnAddress(Address address); 
    } 

그리고 다음 코드는 더 간단하게,

myClass.doSomethingWithAnAddress(address); 

추신 인터페이스 대신 공통 추상 기본 클래스를 가질 수도 있습니다.

+0

-1 : 인터페이스 메소드는 기본적으로 public abstract입니다. – MasterCassim

+1

이 답변의 첫 번째 부분은 다른 모든 답변을 따르므로 왜 downvote입니까? 두 번째 부분은 [OOAD/GRASP] (http://en.wikipedia.org/wiki/GRASP_ (object-oriented_design) # 정보 _ 전문가)의 정보 전문가를 고려하기위한 제안입니다. – user949300

+0

Upvote에 의해 Downvote가 반대했습니다. 귀하의 대답은 정확합니다. –

0

똑같은 메소드 호출을 사용하여 4 개의 클래스에서 동일한 연산을 수행해야하는 경우, 해당 클래스는 아마도 동일한 인터페이스를 구현하거나 동일한 수퍼 클래스에서 확장됩니다. 이 경우, 해당 인터페이스/추상 클래스에 대해

doSomething(Interface myClass, Address address); 
1

편집을 프로그램 할 수 있습니다 : 당신이 코멘트에서 알게 될 것이다, 우리는 강하게 특히 초보자로서, 내 코드 예제에서 사용 된 관행을 단념. 그러나 여전히 참고 용으로 제공됩니다.

당신이 상속과 다형성을 탐험하고 싶다고 생각합니다. 적어도이 부분을 통합 해결할

myMethod(Object myClass, Address address){ 
    if(myClass instanceof MyClass1){ 
     MyClass1 mc = (MyClass1) myClass; 
     doStuff(); 
    } 
    else if(myClass instanceof MyClass2){ 
     MyClass2 mc = (MyClass2) myClass; 
     doStuff(); 
    } 
    else if(myClass instanceof MyClass3){ 
     MyClass3 mc = (MyClass3) myClass; 
     doStuff(); 
    } 
    else if(myClass instanceof MyClass4){ 
     MyClass4 mc = (MyClass4) myClass; 
     doStuff(); 
    } 
    else panic(); 
} 

: 또는 내가 못생긴 솔루션은 객체 당신의 MyClass에 인수, 같은 무언가를 '상승'하는 것 같아요. 상속과 다형성은 훨씬 더 섹시합니다.

+0

instanceOf 패턴을 사용하지 않는 것이 좋습니다. 이것이 OOP를 사용하여 피하는 것입니다. –

+0

-1 : 위 참조 - – MasterCassim

+0

그건 가혹합니다. 그건 추천이 아니므로 상속과 다형성에 중점을 둡니다. 아무도 사용법을 찾지 못하면 나는 제안을하고 있었다. – c24w

관련 문제