2010-03-15 11 views
0

C#으로 작성된 간단한 클래스 라이브러리 (COM + 서비스)가 Add, Minus, Divide, Multiply 및 Compare라는 5 개의 웹 서비스를 사용합니다."Product"의 추상 메서드 - 팩토리 메서드 C#

나는 추상 제품 클래스와 추상 팩토리 클래스를 만들었습니다. , 보시다시피

public abstract class WS 
{ 

    public abstract double Calculate(double a, double b); 

    public abstract string Compare(double a, double b); 
} 

, 서브 클래스 중 하나가 WS를 상속 두 가지 방법은 어떤 서브 클래스에서 유용하지 않을 수있는 오버라이드 (override) 할 수 있어야합니다 : 추상 제품은 WS의 코드 이름. 예 : 과 비교 Calculate() 메소드는 필요하지 않습니다.

새 CompareWS 개체를 인스턴스화하려면 클라이언트 클래스가 WS 개체 형식을 반환하는 CreateWS() 메서드를 호출합니다.

public class CompareWSFactory : WSFactory 
{ 
    public override WS CreateWS() 
    { 
     return new CompareWS(); 
    } 
} 

그러나 Compare()가 WS에 정의되어 있지 않으면 Compare() 메서드를 호출 할 수 없습니다. 이는 클라이언트가 CompareWS 객체가 아닌 WS 유형 객체를 사용하기 때문입니다.

이것은 두 가지 방법이있는 예일 뿐이지 만 더 많은 방법이 있다면 어떻게 될까요? WS 클래스에서 모든 메서드를 추상으로 정의하는 것이 멍청한가요?

제 질문은 : WS의 모든 하위 클래스에 공통적 인 추상 메소드를 정의하려고합니다. 반면에 팩토리가 WS 객체 유형을 생성 할 때 하위 클래스의 모든 메소드가 호출 될 수 있습니다 (WS의 오버라이드 메소드 및 메소드 서브 클래스에서). 어떻게해야합니까?

+0

의견을 보내 주셔서 감사합니다. 제 문제를 약간 수정 해 드리겠습니다. WS 클래스에서 정의되는 추상 메소드는 Add(), Minus(), Divide(), Multiply() 및 Compare()입니다. 따라서 각 메소드에 대한 인터페이스를 작성하는 것은 실용적이지 않습니까? 물론 이것은 단지 예일뿐입니다. " – Bally

답변

0

Regina, 추상 클래스는 추상 및 가상 메소드를 모두 정의 할 수 있습니다. 가상 메서드는 기본 클래스의 몇 가지 기본 구현을 포함하지만, 필요에 따라 파생 클래스에 의해 오버라이드 (override) 할 수 있습니다

public abstract class WS 
{ 

    // All derived classes will have to implement this 
    public abstract double Calculate(double a, double b); 

    // This can be overriden by derived classes (since it's a virtual method) 
    public virtual string Compare(double a, double b) 
    { 
     // Some default implementation. 
     // Any derived classes can override this implementation if they want 
    } 
} 
0

WS 클래스의 모든 하위 클래스에 공통된 모든 메서드를 선언 할 수 있지만 파생 클래스에서 구현이 변경되는 메서드 만 추상 선언해야합니다. Compare을 astract로 만드는 것은 의미가 없습니다. 왜 그러한 방법을 호출 할 수 없다고합니까?

한 클래스에서 항상 추상 및 비 추상적 메서드를 사용할 수 있으며 Compare 메서드는 추상화 일 필요는 없습니다.

+0

알겠습니다. 나는 Compare() 메소드가 WS에 존재하지 않지만 오직 CompareWS (WS의 서브 클래스)에있을 때만 호출 될 수 있다고 언급했다. 왜냐하면 Concrete Factory는 CompareWS가 아닌 WS 유형의 객체를 생성 할 것이기 때문이다. 즉 WS compareWS = CompareFactory.CreateWS(); 이 경우 compareWS.Compare() 호출이 작동하지 않습니다. – Bally

0

당신이 클래스는 추상 클래스를 상속 해, 모든 추상 메소드의 몸을 제공하지 않는 경우는, 그 클래스가된다 추상뿐만 아니라. 이 문제의 한 가지 해결책은 클래스 대신 인터페이스를 사용하는 것입니다!

interface ICalculate 
{ 
    double Calculate(double a, double b); 
} 
interface ICompare 
{ 
    string Compare(double a, double b); 
} 
class Compare : ICompare 
{ 
    public double ICompare.Compare(double a, double b) { .... } 
} 
class CompareAndCalculate : ICompare, ICalculate 
{ 
    public string ICompare.Compare(double a, double b) { .... } 
    public double ICalculate.Calculate(double a, double b) {...} 
} 
+0

이 방법을 Factory/Abstract Factory Method 디자인 패턴에 적용 할 수 있습니까? 제 디자인 패턴이 폭력적일까요? – Bally

관련 문제