English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C# で組み込みの演算子を再定義またはオーバーロードできます。したがって、プログラマーはユーザー定義の型の演算子を使用することもできます。オーバーロード演算子は特別な名前を持つ関数であり、キーワード operator 演算子の記号に続いて定義されます。他の関数と同様に、オーバーロード演算子には返り値の型と引数リストがあります。
例えば、以下の関数を見てください:
public static Box operator+ (Box b, Box c) { Box box = new Box(); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; return box; }
上記の関数はユーザー定義のクラス Box に加法演算子(+)。これは二つの Box オブジェクトの属性を足し合わせ、足し合わせた後の Box オブジェクトを返します。
以下のプログラムは完全な実装を示しています:
using System; namespace OperatorOvlApplication { class Box { private double length; // 長さ private double breadth; // 幅 private double height; // 高さ public double getVolume() { return length * breadth * height } public void setLength(double len) { length = len; } public void setBreadth(double bre) { breadth = bre; } public void setHeight(double hei) { height = hei; } // オーバーロード + 演算子を使って2つのBoxオブジェクトを足し合わせます public static Box operator+ (Box b, Box c) { Box box = new Box(); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; return box; } } class Tester { static void Main(string[] args) { Box Box1 = new Box(); // Boxを宣言します1、型は Box Box Box2 = new Box(); // Boxを宣言します2、型は Box Box Box3 = new Box(); // Boxを宣言します3、型は Box double volume = 0.0; // 大きさ // Box1 詳細 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2 詳細 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // Box1 の大きさ volume = Box1.getVolume(); Console.WriteLine("Box1 volume); // Box2 の大きさ volume = Box2.getVolume(); Console.WriteLine("Box2 volume); // 二つのオブジェクトを足し合わせます Box3 = Box1 + Box2; // Box3 の大きさ volume = Box3.getVolume(); Console.WriteLine("Box3 volume); Console.ReadKey(); } } }
上記のコードがコンパイルされ実行された場合、以下のような結果が得られます:
Box1 の体積: 210 Box2 の体積: 1560 Box3 の体積: 5400
以下の表は C# での演算子オーバーロードの能力を説明しています:
演算子 | 説明 |
---|---|
+, -, !, ~, ++, -- | これらの一本項演算子は一つの操作数を持ち、オーバーロードできます。 |
+, -, *, /, % | これらの二項演算子は二つの操作数を持ち、オーバーロードできます。 |
==, !=, <, >, <=, >= | これらの比較演算子はオーバーロードできます。 |
&&, || | これらの条件論理演算子は直接オーバーロードできません。 |
+=, -=, *=, /=, %= | これらの代入演算子はオーバーロードできません。 |
=, ., ?:, ->, new, is, sizeof, typeof | これらの演算子はオーバーロードできません。 |
上記の議論に基づいて、上記の例を拡張して、より多くの演算子をオーバーロードします:
using System; namespace OperatorOvlApplication { class Box { private double length; // 長さ private double breadth; // 幅 private double height; // 高さ public double getVolume() { return length * breadth * height } public void setLength(double len) { length = len; } public void setBreadth(double bre) { breadth = bre; } public void setHeight(double hei) { height = hei; } // オーバーロード + 演算子を使って2つのBoxオブジェクトを足し合わせます public static Box operator+ (Box b, Box c) { Box box = new Box(); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; return box; } public static bool operator ==(Box lhs, Box rhs) { bool status = false; if (lhs.length == rhs.length && lhs.height == rhs.height && lhs.breadth == rhs.breadth) { status = true; } return status; } public static bool operator !=(Box lhs, Box rhs) { bool status = false; if (lhs.length != rhs.length || lhs.height != rhs.height || lhs.breadth != rhs.breadth) { status = true; } return status; } public static bool operator <(Box lhs, Box rhs) { bool status = false; if (lhs.length < rhs.length && lhs.height <=rhs.height && lhs.breadth < rhs.breadth) { status = true; } return status; } public static bool operator >(Box lhs, Box rhs) { bool status = false; if (lhs.length > rhs.length && lhs.height >=rhs.height && lhs.breadth > rhs.breadth) { status = true; } return status; } public static bool operator <=(Box lhs, Box rhs) { bool status = false; if (lhs.length <= rhs.length && lhs.height <=rhs.height && lhs.breadth <= rhs.breadth) { status = true; } return status; } public static bool operator >=(Box lhs, Box rhs) { bool status = false; if (lhs.length >= rhs.length && lhs.height >=rhs.height && lhs.breadth >= rhs.breadth) { status = true; } return status; } public override string ToString() { return String.Format("({0}, {1}, {2})", length, breadth, height); } } class Tester { static void Main(string[] args) { Box Box1 = new Box(); // Boxを宣言します1、型は Box Box Box2 = new Box(); // Boxを宣言します2、型は Box Box Box3 = new Box(); // Boxを宣言します3、型は Box Box Box4 = new Box(); double volume = 0.0; // 大きさ // Box1 詳細 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2 詳細 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // 重载された ToString()を使って二つのボックスを表示します Console.WriteLine("Box1: {0}1.ToString()); Console.WriteLine("Box2: {0}2.ToString()); // Box1 の大きさ volume = Box1.getVolume(); Console.WriteLine("Box1 volume); // Box2 の大きさ volume = Box2.getVolume(); Console.WriteLine("Box2 volume); // 二つのオブジェクトを足し合わせます Box3 = Box1 + Box2; Console.WriteLine("Box3: {0}3.ToString()); // Box3 の大きさ volume = Box3.getVolume(); Console.WriteLine("Box3 volume); //ボックスの大きさを比較しています: {0} if (Box1 > ボックス2) Console.WriteLine("Box1 より大きい ボックス2"); else Console.WriteLine("Box1 ≦ Box2"); if (Box1 < ボックス2) Console.WriteLine("Box1 < Box2"); else Console.WriteLine("Box1 ≧ Box2"); if (Box1 > Box2) Console.WriteLine("Box1 >= Box2"); else Console.WriteLine("Box1 ≦ Box2"); if (Box1 >= Box2) Console.WriteLine("Box1 ≤ Box2"); else Console.WriteLine("Box1 ≥ Box2"); if (Box1 ≠ Box2) Console.WriteLine("Box1 ≠ Box2"); else Console.WriteLine("Box1 = Box2"); Box4 = Box3; if (Box3 = Box4) Console.WriteLine("Box3 = Box4"); else Console.WriteLine("Box3 ≠ Box4"); Console.ReadKey(); } } }
上記のコードがコンパイルされ実行された場合、以下のような結果が得られます:
Box1: (6, 7, 5) Box2: (12, 13, 10) Box1 の体積: 210 Box2 の体積: 1560 Box3: (18, 20, 15) Box3 の体積: 5400 Box1 ≦ Box2 Box1 < Box2 Box1 ≦ Box2 Box1 ≤ Box2 Box1 ≠ Box2 Box3 = Box4