2013-06-17 2 views
1

저는 분수, 십진수 및 수학 상수 (즉, 파이, 오일러 번호)와 같은 여러 유형의 수학적 값으로 작업 할 프로젝트를 진행 중입니다.하나의 일반적인 방법이나 여러 가지 오버로드 된 방법이 더 적절합니까?

나는이 코드를 사용하여 각각의 유형이 상속하는 추상 기본 클래스를 만들었습니다. 나는 파생 클래스의 각 오버로드 방법과 그 방법을 교체해야하는 경우

public abstract class MathValue 
{ 
    public abstract double Value { get; set; } 

    protected bool irrational; 

    public virtual bool IsIrrational 
    { 
     get { return this.irrational; } 
    } 

    public virtual T ToValueType<T>(bool ignoreConstraints) where T : MathValue; 

    public abstract MathValue Add<TParam>(TParam val) where TParam : MathValue; 
    public abstract MathValue Subtract<TParam>(TParam val) where TParam : MathValue; 
    public abstract MathValue Multiply<TParam>(TParam val) where TParam : MathValue; 
    public abstract MathValue Divide<TParam>(TParam val) where TParam : MathValue; 
} 

그러나 나는 지금 여기에 일반적인 방법을 사용하는 것이 적절한 지 여부에 의문을 제기하거나하고있다.

이 경우 어느 쪽이 더 적절합니까?

+4

는 동일한 기능을 수행 할 것이다 당신의 오버로드 위치 : 나는 모든 개체에 대한 출력 ToString하려면 어떤 객체가 ToString() 방법이 있기 때문에, 나는 그러나 나는 것입니다 내 예를 위해 ... 제네릭을 사용하지 않을 수도 물건을 추가하거나, 오일러 번호를 추가 할 때 PI를 추가하는 경우 다르게 번호를 추가합니까? 만약 당신이 신경 쓰지 않는다면, 그냥'MathValue'를 받아들입니다. 당신이 뭔가 다른 일을해야한다면 (이 경우에는 적용되지 않는 것 같습니다), 그러면 다른 오버로드가 생깁니다. – Servy

+0

귀하의 질문을 더 잘 이해할 수있을 것으로 생각합니다. 귀하가 생각한 샘플 구현이 도움이 될 것입니다. @Servy가 언급했듯이 구현 클래스와 동일한 유형의 MathValue 만 추가 할 수 있도록 구현 "추가"메서드가 필요합니까? – Tombala

+0

그들은 다른 행동을합니다. 예를 들어 소수에 간단한 숫자 값을 추가 할 때 십진수로 변환하는 것이 아닌 부적절한 분수를 만들고 싶습니다. 목표는 MathValue 객체를 수학 표현식의 계수 및 지수로 사용하는 것입니다. –

답변

2

일반적으로 오버로드는 유형에 따라 기능을 사용자 정의해야하는 시나리오에 가장 적합하다고 생각하지만 유형에 관계가없고 유형간에 공유되는 기능에는 제네릭이 적합합니다.

입력 매개 변수에 따라 다른 작업을 수행하는 오버로드 클래스의 좋은 예는 Convert 클래스 메서드입니다 (예 : ToInt32). 오버로드는 32 개입니다.

모든 유형의 같은 일을 제네릭 클래스의 좋은 예는 모든 유형의 T.

에 대해 같은 방식으로 행동, 당신은 강력한 형식의 방법으로 목록에있는 모든 유형을 넣어 드릴 것입니다 List<T>입니다

ToString() 값 반환의 예 : 나는 각 유형에 대해 다르게 ToString(), 나는 다른 매개 변수 유형에 대해 서로 다른 과부하 (또는 다른 클래스)를 사용하는 것 출력하려면

을 :

public class MyMathClass 
{ 
    public string GetToString(int myValue) 
    { 
     return "My Int: " + myValue; 
    } 

    public string GetToString(double myValue) 
    { 
     return "My Double: " + myValue; 
    } 
} 
public class MyMathClass<T> 
{ 
    public void GetToString<T>(T myValue) 
    { 
     return myValue.ToString(); 
    } 
}