回答編集履歴
4
修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
サブクラスをスーパークラスにキャストして使うのがポリモーフィズムです。
|
5
|
+
サブクラスをスーパークラスにキャストし、スーパークラスとして使うのがポリモーフィズムです。
|
6
6
|
|
7
7
|
|
8
8
|
|
3
書き直し
test
CHANGED
@@ -1,71 +1,9 @@
|
|
1
|
-
|
1
|
+
難しすぎたようなので、簡単に書き直します。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
サブクラスをスーパークラスにキャストして使うのがポリモーフィズムです。
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
### 追記
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
ポリモーフィズムは次のように使います。
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
たとえば、ファイルまたはネットワークから文字列 "Hello World!" を読むメソッドを作りたいとします。その場合は、ファイルを読むクラス FileStream またはネットワークを読むクラス NetworkStream を使うわけですが、実際の読み込みはそれらの先祖である Stream クラスを使います。
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
```C#
|
22
|
-
|
23
|
-
bool ReadHelloWorld(Stream stream)
|
24
|
-
|
25
|
-
{
|
26
|
-
|
27
|
-
using (var reader = new StreamReader(stream))
|
28
|
-
|
29
|
-
{
|
30
|
-
|
31
|
-
string result = reader.ReadLine();
|
32
|
-
|
33
|
-
return result == "Hello World!";
|
34
|
-
|
35
|
-
}
|
36
|
-
|
37
|
-
}
|
38
|
-
|
39
|
-
```
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
9
|
+
サブクラスにあり、スーパークラスに無いメソッドは、ポリモーフィズムを使う以外の場所、つまりキャストしない場所で使います。
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
```C#
|
48
|
-
|
49
|
-
using (var stream = new FileStream(fileName))
|
50
|
-
|
51
|
-
{
|
52
|
-
|
53
|
-
if (ReadHelloWorld(stream))
|
54
|
-
|
55
|
-
{
|
56
|
-
|
57
|
-
Console.WriteLine($"Hello World! が {fileName} から読み込まれました。");
|
58
|
-
|
59
|
-
}
|
60
|
-
|
61
|
-
}
|
62
|
-
|
63
|
-
```
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
これによって、読み込む対象がファイルであろうとネットワークであろうと ReadHelloWorld はそのまま動きます。
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
同様に Stream から派生したクラスを使うなら、暗号化ファイルであろうとアーカイブファイルであろうとデータベースであろうと JSON であろうと、ReadHelloWorld は書き直す必要なく使えます。これがポリモーフィズムです。
|
2
追記
test
CHANGED
@@ -3,3 +3,69 @@
|
|
3
3
|
|
4
4
|
|
5
5
|
ファイルを読み書きするクラスにはファイル名などのプロパティがありますし、ネットワークを読み書きするクラスにはホストなどのプロパティがあります。無ければ不便ですし、あってもポリモーフィズムは破綻しません。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
### 追記
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
ポリモーフィズムは次のように使います。
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
たとえば、ファイルまたはネットワークから文字列 "Hello World!" を読むメソッドを作りたいとします。その場合は、ファイルを読むクラス FileStream またはネットワークを読むクラス NetworkStream を使うわけですが、実際の読み込みはそれらの先祖である Stream クラスを使います。
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
```C#
|
22
|
+
|
23
|
+
bool ReadHelloWorld(Stream stream)
|
24
|
+
|
25
|
+
{
|
26
|
+
|
27
|
+
using (var reader = new StreamReader(stream))
|
28
|
+
|
29
|
+
{
|
30
|
+
|
31
|
+
string result = reader.ReadLine();
|
32
|
+
|
33
|
+
return result == "Hello World!";
|
34
|
+
|
35
|
+
}
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
```
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
そしてそれを呼び出すために状況によって FileStream または NetworkStream を使います。
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
```C#
|
48
|
+
|
49
|
+
using (var stream = new FileStream(fileName))
|
50
|
+
|
51
|
+
{
|
52
|
+
|
53
|
+
if (ReadHelloWorld(stream))
|
54
|
+
|
55
|
+
{
|
56
|
+
|
57
|
+
Console.WriteLine($"Hello World! が {fileName} から読み込まれました。");
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
```
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
これによって、読み込む対象がファイルであろうとネットワークであろうと ReadHelloWorld はそのまま動きます。
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
同様に Stream から派生したクラスを使うなら、暗号化ファイルであろうとアーカイブファイルであろうとデータベースであろうと JSON であろうと、ReadHelloWorld は書き直す必要なく使えます。これがポリモーフィズムです。
|
1
修正
test
CHANGED
@@ -2,4 +2,4 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
ファイルを読み書きするクラスにはファイル名などのプロパティがありますし、ネットワークを読み書きするクラスにはホストなどのプロパティがあります。無ければ不便ですし、ポリモーフィズム
|
5
|
+
ファイルを読み書きするクラスにはファイル名などのプロパティがありますし、ネットワークを読み書きするクラスにはホストなどのプロパティがあります。無ければ不便ですし、あってもポリモーフィズムは破綻しません。
|