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

回答編集履歴

4

脱稿

2016/12/05 05:18

投稿

退会済みユーザー
answer CHANGED
@@ -43,7 +43,7 @@
43
43
  target.Flg = !target.Flg;
44
44
  }
45
45
  ```
46
- 実際は、このメソッドは、他クラスに全く依存しない処理ので,元のクラス実装するか、staticメソッドにするのが良いです。
46
+ 実際は、このメソッドは、他クラスに全く依存しない処理ので,元のクラスにインスタンスメソッドとして実装するか、staticメソッドにするのが良いです。(スタンダードなオブジェクト指向に則るなら前者がいいと思います)
47
47
 
48
48
  ```C#
49
49
  Class TargetClass{

3

補足

2016/12/05 05:18

投稿

退会済みユーザー
answer CHANGED
@@ -34,4 +34,25 @@
34
34
 
35
35
  なぜこのように、メソッド経由で値を書き換えるという回りくどいことをするかというと、仮に._Flgの名前を変えたくなったり,._Flag自体を何らかのクラスのパラメータの一部に変更したくなった時に、._Flgを直接変更すると、._Flgを呼び出しているコードすべてに書き換えコストが生じてしまいます。アクセサを定義しておくと、今回の例では、._Flgの名前や構造が変わっても、Flgメソッドの中身をそこから整合性のあるデータに変えるだけで、.Flgを呼び出している場所は何も変更しなくてもコードが動くことを保証できるようになります。
36
36
 
37
- 大体ここに書かれている内容がわかるようになれば、オブジェクト指向に慣れると思うので頑張ってください。
37
+ 大体ここに書かれている内容がわかるようになれば、オブジェクト指向に慣れると思うので頑張ってください。
38
+
39
+ 補足
40
+
41
+ ```C#
42
+ void ChangeFlag(TargetClass target){
43
+ target.Flg = !target.Flg;
44
+ }
45
+ ```
46
+ 実際は、このメソッドは、他クラスに全く依存しない処理ので,元のクラスで実装するか、staticメソッドにするのが良いです。
47
+
48
+ ```C#
49
+ Class TargetClass{
50
+ void ChangeFlag(){
51
+ this.Flg = !this.Flg;
52
+ }
53
+ }
54
+ 他クラスのどこかで
55
+ (ターゲットクラスのinstance).ChangeFlag()を呼ぶ
56
+ ```
57
+
58
+ という感じです。

2

わかりやすく

2016/12/05 05:16

投稿

退会済みユーザー
answer CHANGED
@@ -11,7 +11,7 @@
11
11
  }
12
12
  ```
13
13
 
14
- というインスタンスメソッドをそれぞれ、Aさん.AddAge(),Bさん.AddAge()の実行後、Aさん.ageは21,Bさん.ageは22になります。thisはそのメソッドを呼び出したインスタンス自身を指していることをわかって頂けたでしょうか。
14
+ というインスタンスメソッドをそれぞれ、Aさん.AddAge(),Bさん.AddAge()の実行後、前者はAさんがメソッドを呼び出したので、Aさん.ageは21,後者はBさんがメソッドを呼び出したので、Bさん.ageは22になります。thisはそのメソッドを呼び出したインスタンス自身を指していることをわかって頂けたでしょうか。
15
15
 
16
16
  次に、違うクラスで、this._Flgはなぜエラーが出るかというと、thisはその**クラス**のインスタンスなので、当然**違うクラスに書かれたthisは違うクラスのインスタンスのみに適用されます**。このインスタンスのクラスには、_Flgというパラメータが存在しないので、エラーがでます。また仮に_Flgが定義されていたとしても、他のクラスが指し示すパラメータとは異なるパラメータなので、this._Flgは自身の所属するクラスのインスタンスのパラメータアクセスになり、他のクラスのインスタンスのパラメータアクセスはできません。ではどうすれば良いかというと、直接そのインスタンスを取得して、プロパティ経由で._Flgの値を書き換えれば良いのです。
17
17
 

1

誤字

2016/12/05 05:07

投稿

退会済みユーザー
answer CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  など
32
32
  ```
33
- などとします。なぜ._Flgを直接書き換えないかというと、privateを元のクラスで指定しているので、他クラスからこの変数にアクセスできないからです。代わりに提示していただいているコードには、Flgのgetterとsetterというアクセサと呼ばれる特殊なメソッドを定義していて、instance.Flg=(適当な値);とすると、instance._Flgが書き換わり、var 適当な変数名=instance.Flg;とすると、値が換わるように定義していて、これがpublicなので他のクラスから呼び出せるようにしています。
33
+ などとします。なぜ._Flgを直接書き換えないかというと、privateを元のクラスで指定しているので、他クラスからこの変数にアクセスできないからです。代わりに提示していただいているコードには、Flgのgetterとsetterというアクセサと呼ばれる特殊なメソッドを定義していて、instance.Flg=(適当な値);とすると、instance._Flgが書き換わり、var 適当な変数名=instance.Flg;とすると、instance._Flgの値が取得できるように定義していて、これがpublicなので他のクラスから呼び出せるようにしています。
34
34
 
35
35
  なぜこのように、メソッド経由で値を書き換えるという回りくどいことをするかというと、仮に._Flgの名前を変えたくなったり,._Flag自体を何らかのクラスのパラメータの一部に変更したくなった時に、._Flgを直接変更すると、._Flgを呼び出しているコードすべてに書き換えコストが生じてしまいます。アクセサを定義しておくと、今回の例では、._Flgの名前や構造が変わっても、Flgメソッドの中身をそこから整合性のあるデータに変えるだけで、.Flgを呼び出している場所は何も変更しなくてもコードが動くことを保証できるようになります。
36
36