[API]IListやIDictionaryを使用する理由 | Unity Forum | Tech Stadium Forum

[API]IListやIDiction...
 
通知
すべてクリア

[API]IListやIDictionaryを使用する理由  

  RSS

Student
(@student)
メンバー Moderator
結合: 4年前
投稿: 1351
17/03/2021 9:46 pm  
techsta_unity_api\UnityProject\DataTest01_Memory
のCommonLib.csでjsonをデコードしたものを
リストとして、また、一つ一つの元素をディクショナリとして処理する部分で
var json = (IList)Json.Deserialize(sStrJson);
IList results = (IList)json;
foreach (IDictionary resultOne in results)
{
string name = (string)resultOne ["name"];
long age = (long)resultOne["age"];
string hobby = (string)resultOne["hobby"]; responseStr += string.Format("{0}:{1}:{2}\n", name, age, hobby);
}
ここでIListやIDictionaryを使用する理由は何でしょうか?
 
最初、「IListがIEnumerableを実装(継承?)しているので、foreachを使えるから」という理由と思ったのですが、
ListでもIEnumerableを実装しているのでわざわざIListを使用する理由がわかりませんでした。
 
IDictionaryについても同様にただのDictionaryを使用しない理由がわかりません。
ご教授いただけますようお願いします。
 
※また、ついでで恐縮なのですが、「IListがIEnumerableを実装している」という文章を
どこかのWebページでみつけたのですが、こちらは「実装」ではなく「継承」だと思うのですが、「実装」と「継承」は同じ意味と考えてよいのでしょうか?
This topic was modified 4年前 by Student

引用
Teacher
(@admin)
メンバー Admin
結合: 5年前
投稿: 1318
17/03/2021 9:48 pm  

結論から言うと、「List」でも「IList」でもどちらでも構いません。
ですが、IListの方はinterfaceですので、Add等のメソッドは実装されていません(宣言がされているだけですね)
なので逆に言えば、AddRemove等を使わないのであれば、IListで十分ということです。

これは他人がプログラムを見る時に非常に有用な書き方であり、「IListで宣言されたオブジェクトはAddRemoveを行わないものである。」とひと目でわかるメリットがあります。
IDictionaryも同様なメリットがあります。

一人で開発をしているとなかなか気が付かない部分ですね。

※実装と継承について
少し難しいですが、そもそもinterfaceとclassの継承は別のものです。
interfaceを継承してクラスを定義することを、「interfaceを実装する」と言います。
なぜかと言うと、interfaceには中身が実装されておらず、宣言のみされているからですね。

その代わり、interfaceで宣言されているメソッド(抽象メソッド)は実装先でoverrideを強制されます。
継承先で中身の実装を必ず行うので、interfaceのことは継承すると言わずに実装するという訳です。

interfaceは今後の開発で役立つと思うので、しっかり調べておくことを勧めます。
https://ufcpp.net/study/csharp/oo_interface.html


返信引用
共有:
タイトルとURLをコピーしました