문제

나는 다른 의미를 가진 많은 정수를 가진 많은 코드를 가지고 있습니다 (일반적인 해결책이지만 특정 예 : 월 1 일 vs. 년 vs. 년 등). 이러한 의미에 따라 클래스 생성자를 과부하 할 수 있기를 원합니다.

예를 들어

int a; // takes role A
int b; // takes role B

var A = new Foo(a);  // should call one constructor
var B = new Foo(b);  // should call another constructor

이제는 분명히 작동하지 않지만 (별명이 아닌) 유형을 정의 할 수 있다면 int 다음과 같은 이름을 제외한 모든 것 :

typedef int TypeA;  // stealing the C syntax
typedef int TypeB;

필요한 과부하를 할 수 있고 유형 시스템이 무엇이 무엇인지 추적하도록 할 수 있습니다. 특히 이것은 값이 혼합되지 않았 음을 확인할 수 있습니다. 예를 들어, 1 년으로서 함수에서 반환 된 값은 월간으로 사용되지 않습니다.

어떤 방법이 부족합니까? class 또는 struct C#에서이 작업을 수행하는 포장지?


솔루션이 부유물과 복식에도 효과가 있다면 좋을 것입니다.

도움이 되었습니까?

해결책

직접 typedef 동등한 것은 없지만 다음을 수행 할 수 있습니다.

using TypeA = int;
using TypeB = int;

그러나 이것은 새로운 강력한 유형을 만들기보다는 유형을 별칭으로 만듭니다. 따라서 컴파일러는 여전히 int 방법 호출을 해결할 때.

더 나은 솔루션은 랩핑하는 간단한 래퍼 클래스를 만드는 것일 수 있습니다. int 다음과 같은 암시 적 주조를 제공합니다.

struct TypeA
{
   public TypeA(int value)
   {
      this.realValue = value;
   }

   private int realValue;
   public static implicit operator int(TypeA value)
   {
     return this.realValue;
   }

   public static implicit operator TypeA(int value)
   {
     return new TypeA(value);
   }
}

그러나 대부분의 상황에서 enum 더 적합 할 것입니다.

다른 팁

이것은 벗어날 수 있지만 이에 열거를 사용할 수 없습니까? Enum Base는 int이지만 입력되며 전달 된 열거 유형에 따라 다른 생성자를 정의 할 수 있습니다.

생성자만을위한 것이라면 다음과 같은 것을 사용할 수 없습니다.

 int dom = 5;
int doy = 100;

Foo b = Foo.NewFromDayoftheMonth(dom);

Foo c = Foo.NewFromDayoftheYear(doy);

각 방법이 정적이며 전달 된 매개 변수를 기반으로 새 FOO 객체를 만듭니다.

이것은 다른 것이 많지 않은 나에게 해결책처럼 보입니다.

또한 값 주위에 구조물을 만들 것입니다.

public struct TypeA
{
  private int value;
  public TypeA(int value)
  {
    this.value = value;
  }

  public static explicit operator int(TypeA a)
  {
     return a.value;
  }

  public static explicit operator TypeA(int value)
  {
     return new TypeA(value);
  }
}

또한 연산자에게 유형과 방법을 결합하여 INT 값 주위에 풍부한 유형을 제공하도록 선언 할 수도 있습니다.

1 년 유형은 a IsLeap 속성, 요일은 1 ~ 31 사이의 값으로 구속 될 수 있으며 특별한 산술을 제공 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top