teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

修正

2020/07/10 03:46

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  難しすぎたようなので、簡単に書き直します。
2
2
 
3
- サブクラスをスーパークラスにキャストして使うのがポリモーフィズムです。
3
+ サブクラスをスーパークラスにキャストし、スーパークラスとして使うのがポリモーフィズムです。
4
4
 
5
5
  サブクラスにあり、スーパークラスに無いメソッドは、ポリモーフィズムを使う以外の場所、つまりキャストしない場所で使います。

3

書き直し

2020/07/10 03:46

投稿

Zuishin
Zuishin

スコア28675

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

2

追記

2020/07/10 03:45

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -1,3 +1,36 @@
1
1
  例えば C# の話ですが、ファイルを読み書きするクラスもネットワークを読み書きするクラスも、バイト列を読み書きするクラスから派生します。
2
2
 
3
- ファイルを読み書きするクラスにはファイル名などのプロパティがありますし、ネットワークを読み書きするクラスにはホストなどのプロパティがあります。無ければ不便ですし、あってもポリモーフィズムは破綻しません。
3
+ ファイルを読み書きするクラスにはファイル名などのプロパティがありますし、ネットワークを読み書きするクラスにはホストなどのプロパティがあります。無ければ不便ですし、あってもポリモーフィズムは破綻しません。
4
+
5
+ ### 追記
6
+
7
+ ポリモーフィズムは次のように使います。
8
+
9
+ たとえば、ファイルまたはネットワークから文字列 "Hello World!" を読むメソッドを作りたいとします。その場合は、ファイルを読むクラス FileStream またはネットワークを読むクラス NetworkStream を使うわけですが、実際の読み込みはそれらの先祖である Stream クラスを使います。
10
+
11
+ ```C#
12
+ bool ReadHelloWorld(Stream stream)
13
+ {
14
+ using (var reader = new StreamReader(stream))
15
+ {
16
+ string result = reader.ReadLine();
17
+ return result == "Hello World!";
18
+ }
19
+ }
20
+ ```
21
+
22
+ そしてそれを呼び出すために状況によって FileStream または NetworkStream を使います。
23
+
24
+ ```C#
25
+ using (var stream = new FileStream(fileName))
26
+ {
27
+ if (ReadHelloWorld(stream))
28
+ {
29
+ Console.WriteLine($"Hello World! が {fileName} から読み込まれました。");
30
+ }
31
+ }
32
+ ```
33
+
34
+ これによって、読み込む対象がファイルであろうとネットワークであろうと ReadHelloWorld はそのまま動きます。
35
+
36
+ 同様に Stream から派生したクラスを使うなら、暗号化ファイルであろうとアーカイブファイルであろうとデータベースであろうと JSON であろうと、ReadHelloWorld は書き直す必要なく使えます。これがポリモーフィズムです。

1

修正

2020/07/10 03:06

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -1,3 +1,3 @@
1
1
  例えば C# の話ですが、ファイルを読み書きするクラスもネットワークを読み書きするクラスも、バイト列を読み書きするクラスから派生します。
2
2
 
3
- ファイルを読み書きするクラスにはファイル名などのプロパティがありますし、ネットワークを読み書きするクラスにはホストなどのプロパティがあります。無ければ不便ですし、ポリモーフィズム破綻しません。
3
+ ファイルを読み書きするクラスにはファイル名などのプロパティがありますし、ネットワークを読み書きするクラスにはホストなどのプロパティがあります。無ければ不便ですし、あってもポリモーフィズム破綻しません。