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

回答編集履歴

1

補足追記

2016/04/03 12:45

投稿

Odacchi
Odacchi

スコア907

answer CHANGED
@@ -1,2 +1,35 @@
1
1
  親クラスの変数に格納すると、親クラスで定義されているメンバ(フィールド、メソッド)しか使えません。
2
- オブジェクト指向の基本です。
2
+ オブジェクト指向の基本です。
3
+
4
+ ---補足追記-----
5
+ Animalクラスというクラスがあり、
6
+ Animalクラスを継承したHumanクラス、Animalクラスを継承したDogクラスがそれぞれあったとします。
7
+ そして、Humanクラスには、仮に、「心(Mind)」というプロパティがあったと仮定しましょう。
8
+ (ここで、犬には心がないのかという倫理的or学術的な話は置いといてください。人間のみに心があると仮定します。)
9
+
10
+ つまり下記のようなクラス定義となるでしょう。
11
+
12
+ ```Swift
13
+ Animal {
14
+ func doSomething() // doSomething()メソッド
15
+ }
16
+
17
+ Human : Animal {
18
+  var mind:Mind // mindプロパティ
19
+ /*以下略*/
20
+ }
21
+
22
+ Dog : Animal {
23
+ /*以下略*/
24
+ }
25
+ ```
26
+
27
+ 今おっしゃってることはHumanクラスのインスタンスをAnimal型の変数に代入しても、mindプロパティを呼び出せるはずという主張です。
28
+ では、DogクラスのインスタンスをAnimal型の変数に代入してもmindプロパティを呼び出せるのでしょうか?
29
+
30
+ Animalクラスとして扱う以上、Animalクラスのメンバ(メソッド、プロパティ)にしかアクセスできないのは、自然なことです。
31
+ Animal型の配列にDogとHumanのインスタンス(への参照)を代入して、for文で回してdoSomething()メソッドを呼び出すような使い方ができます(これをポリモーフィズムと言います)が、mindプロパティが呼び出せてしまったら、安全にポリモーフィズムを実現できませんね(dog.mindと呼べるとしたら思わぬ動作orエラーとなるでしょうから)。
32
+
33
+
34
+ Swiftという以前にオブジェクト指向の考え方を一度勉強されてはいかかがでしょうか?
35
+ 今なら、なぜこう書くのがダメなのかがすっきりすると思います。