2010-01-06 4 views
1

내 학기 프로젝트 용 단위 변환기를 개발 중입니다. 클래스/인터페이스/추상 클래스의 구조에 대한 도움이 필요합니다. 클래스 (DegreesConverter, MassConverter, LenghtConverter)에서 상속 할 수있는 인터페이스 또는 추상 클래스가 필요합니다. 어쩌면 interface IUnitConvert<Type>처럼 말입니다. 우선 각도 (도, 라디안, 그라디언트), 힘 (뉴턴, 파스칼) 및 데이터 (바이트, 킬로바이트, 메가 바이트, 기가 바이트, 테라 바이트)를 먼저 다루겠습니다. 어떤 제안?단위 변환기 프로그램

+0

지금까지 무엇이 있습니까? – John

+0

죄송 합니다만 UI 만 있습니다. –

답변

2

마음에 떠오르는 것은 System.TimeSpan과 같은 것입니다. 여기서 같은 클래스는 시간을 나타내며 속성을 통해 다른 단위로 액세스합니다.

당신은 어떤 일정한 단위 (아마도 SI)에 내부적으로 값을 저장하고 속성 게터/세터로 변환 할

:

Distance d = new Distance; 
d.Meters = 5000; 
var km = d.Kilometers; // km = 5; 

또는 각 단위 클래스를 만들 수 있습니다

public sealed class DistanceUnit 
{ 
    public DistanceUnit(string name, string symbol, double scale) 
    { 
     Name = name; 
     Symbol = symbol; 
     Scale = scale; 
    } 

    public string Name { get; private set; } 
    public string Symbol { get; private set; } 
    public double Scale { get; private set; } 
} 


public abstract class Distance 
{ 
    protected Distance(double value) 
    { 
     this.Value = value; 
    } 

    protected Distance() 
    { 
    } 

    public double Value { get; set; } 

    public abstract DistanceUnit Unit { get; } 

    public override string ToString() 
    { 
     return this.Value + " " + Unit.Symbol; 
    } 


    public static void Convert<TIn, TOut>(TIn original, out TOut result) 
     where TIn : Distance, new() 
     where TOut : Distance, new() 
    { 

     result = new TOut(); 

     var scale = result.Unit.Scale/original.Unit.Scale; 

     result.Value = original.Value * scale; 
    } 

} 

public sealed class Meter : Distance 
{ 

    private static readonly DistanceUnit s_Unit = new DistanceUnit("Meter", "m", 1); 

    public Meter(double value) : base(value) 
    { 
    } 

    public Meter() 
    { 
    } 

    public override DistanceUnit Unit 
    { 
     get { return s_Unit; } 

    } 
} 

public sealed class Kilometer : Distance 
{ 
    private static readonly DistanceUnit s_Unit = new DistanceUnit("Kilometer", "km", .001); 

    public Kilometer() 
    { 
    } 

    public Kilometer(double value) 
     : base(value) 
    { 
    } 

    public override DistanceUnit Unit 
    { 
     get { return s_Unit; } 
    } 
} 

다음과 같이 사용됩니다

Meter distanceHome = new Meter(10000); 
Kilometer distanceInKMs; 

Distance.Convert(distanceHome, out distanceInKMs); // distanceInKMs.Value = 10 
+0

동일한 Distance.Convert 메서드를 사용합니까? –

+0

예, 거리 (미터, 피트 마일 (Feet Mile) 등)의 두 구현에 대해 동일하게 적용됩니다. –

0

여기에 접근 할 수있는 여러 가지 방법이 있습니다. 델리게이트를 사용하는 한 가지 방법이 있습니다.

public class Converter 
{ 
    public static double Convert(double original, Func<double, double> conversion) 
    { 
     return conversion(original); 
    } 
} 

public class SizeConverter 
{ 
    public static double MegabytesToBytes(double megabytes) 
    { 
     return megabytes * 1048576; 
    } 

    public static double KilobytesToBytes(double kilobytes) 
    { 
     return kilobytes * 1024; 
    } 
} 

이 같은이를 사용하십시오 : 당신이 두 배 이외의 다른 유형을 필요로하는 경우

 double result1 = Converter.Convert(2, SizeConverter.MegabytesToBytes); 
     double result2 = Converter.Convert(2, SizeConverter.KilobytesToBytes); 

, 당신은 변환 방법에 과부하를해야합니다.

+0

이 방법의 문제점은 더 많은 단위를 추가 할 때 SizeConverter 열거 형에서 조합 폭발이 발생한다는 것입니다 - BytesToKB? MBtoKB? 기가 바이트 단위로 추가하면 어떻게됩니까? – Paolo

+0

b/kb/mb/gb/tb를 사용하면 가능한 모든 변환에 대해 20 가지 방법이 사용됩니다. 맞습니까? 나는 각각의 변환이 본질적으로 1 줄의 코드라는 점을 고려하면 불합리하다고 생각하지 않는다. – mdm20

+0

당신이 맞아요, 이것이 이것이 당신이 수업 프로젝트의 범위에서 걱정해야 할 것이라고 생각하지는 않습니다. – slimbo

0

어떻게 사용하고 싶은지 생각해보십시오. 예를 들어, 어떤 종류의 측정 단위를 나타내시겠습니까? 귀하의 기본 단위는 무엇입니까? 측정 단위 간의 변환은 어떻게 처리해야합니까?

오른쪽 버튼을 클릭하면 측정 단위를 나타낼 수있는 방법이 필요하다는 것을 알 수 있습니다. 피트, 미터, 리터, 펄롱,도, 킬로그램, 파운드, 큐리스, 옴 등이 있습니다. 클래스, 일련의 클래스 인 기본 단위 인 피트, 미터, 리터, Furlong을 하위 클래스로 사용합니다. 그런 다음 단위에 가치를 연결하는 방법이 필요하다고 생각합니다. 이 단위/값은 동일한 유형 (길이/거리, 체적, 온도, 질량/중량)의 측정 단위를 변환하는 몇 가지 방법을 제공해야하며, 호출 코드가 무언가 물고기를 시도하면 합당한 예외를 발생시킬만큼 충분히 밝아야합니다 섭씨 27도에서 시속/마일로 변환). 단위/값 인스턴스를 만드는 편리한 방법은 편리 할 것입니다. 유닛/밸류 유닛은 특정 종류 나 클래스의 유닛에 묶어서는 안되지만, 당신이 던질 유닛을 행복하게 처리 할 수 ​​있어야합니다.

Codewise이 같은 일이 잘 될 것 같아 :

UnitValue a, b, c; 

a = new UnitValue(3 * 5280, Feet); 
b = new UnitValue(180, Seconds); 
c = (a/b).As(Miles/Hours); 
cout << c; 

희망

60 miles/hour 

같은 그래서 다른 UnitValue에 의해 하나 UnitValue를 분할하는 것은 새를 생산하는 것을 볼 수 있습니다 인쇄해야합니다 복합 유닛을 가진 UnitValue -이 경우 a/b은 피트/초 단위의 UnitValue를 생성해야하며 변환 루틴 As은이 경우 다른 시간 (이 경우 시간당 마일)으로 변환됩니다.

나는 이것이 당신의 생각을 자극하는 데 도움이되기를 바랍니다.

공유하고 즐기십시오.