1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class Program { static void Main(string[] args) { MyClass inst1 = new MyClass(1); MyClass inst2 = new MyClass(3); MyClass inst3 = inst1 + inst2; Console.WriteLine(inst3); } } public class MyClass { int value; public override string ToString() { return value.ToString(); } public MyClass(int value) { this.value = value; } public MyClass() : this(0) { } public static MyClass operator +(MyClass left, MyClass right) { return new MyClass(left.value + right.value); } } | cs |
실행결과 : 4
아주 잘된다.
배열 인덱스 연산자 []는 오버로드 할 수 없지만, C#에서는 이를 대체하는 별도의 인덱서 구문을 지원한다.
추후 정리.
형변환 연산자 (type)x 또한 오버로드할 수 없지만, explicit, implicit를 이용해 대체 정의가 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | class Program { static void Main(string[] args) { Gram gram = new Gram(2000); KilloGram kg = new KilloGram(3); // Gram wrongGram = new KilloGram(3); // 빌드 안됨. explicit은 명시적 캐스팅만 허용 KilloGram kgFromGram = gram; // 잘됨 // Gram gramFromKg = kg; // 당연히 안됨 Gram gramForKg = (Gram)kg; Console.WriteLine(gram); Console.WriteLine(kg); Console.WriteLine(kgFromGram); Console.WriteLine(gramForKg); } } public class Weight { decimal value; public decimal Value { get { return value; } } public Weight(decimal value) { this.value = value; } } public class Gram : Weight { public Gram(decimal value) : base(value) { } public override string ToString() { return Value + "g"; } static public implicit operator KilloGram(Gram gram) { return new KilloGram(gram.Value / 1000m); } } public class KilloGram : Weight { public KilloGram(decimal value) : base(value) { } public override string ToString() { return Value + "kg"; } static public explicit operator Gram(KilloGram kg) { return new Gram(kg.Value * 1000m); } } | cs |
출력 결과 :
2000g
3kg
2kg
3000g
형 변환 연산자 오버로딩 예시이다.
implicit은 암시적 형변환을 허용하고,
explicit은 형변환 연산자를 사용할 때만 형변환을 해준다.
'C#' 카테고리의 다른 글
C# 델리게이트(delegate) (0) | 2016.06.08 |
---|---|
C# 추상 클래스 (0) | 2016.06.08 |
C# 클래스 - Object 클래스 (0) | 2016.06.08 |
C# 클래스 - 상속 (0) | 2016.06.08 |
C# 클래스 - 형변환 (0) | 2016.06.08 |