Ⅰ. 前提
現在3つのクラスとインターフェイスがあります。
- IProduct
商品について必要最低限を定義したインターフェイス
2. AmazonProduct
Amazonの商品について定義したクラス(IProductを継承)
3. EbayProduct
Ebayの商品について定義したクラス(IProductを継承)
C#
1interface IProduct 2{ 3 string Name { get; set; } 4 int Price { get; set; } 5} 6 7public class AmazonProduct : IProduct 8{ 9 public string Asin { get; set; } // Amazonグループだけが取り扱う特殊な番号 10 public string Name { get; set; } 11 public int Price { get; set; } 12} 13 14public class EbayProduct : IProduct 15{ 16 public Country OwnerCountry { get; set; } // 出品者の国 17 public string Name { get; set; } 18 public int Price { get; set; } 19}
Ⅱ. やりたい事、聞きたいこと
C#
1private List<IProduct> GetAmazonProducts() 2{ 3 var amazonProducts = new List<AmazonProduct>(); 4 amazonProducts.Add(new AmazonProduct() { Asin = "Asin001", Name = "Name001", Price = 100 }); 5 6 // エラー 7 // System.Collections.Generic.List<AmazonProduct>' を 8 // 'System.Collections.Generic.List<IProduct>' に暗黙的に変換できません 9 return amazonProducts; 10}
- 戻り値として
List<IProduct>
を返したいと思っています。
しかし、上記のように書くとコンパイル時にエラーが出ます。
どのようにすればエラーが無くなりますでしょうか?
- 有効桁数が減ってしまいますが、
long型
の変数をint型
にキャスト出来るのと同様に、
Amazon固有のAsin
が無くなってしまいますが、
AmazonProduct
もIProduct
にキャストできるものだと理解しています。
この理解がそもそも間違いなのでしょうか?
※下にサンプルコードを載せました
Ⅲ. 試したこと
2 のことが間違いないか確かめる為に以下のサンプルを書いた所動作しました。
よって、理解に間違いはないかと思いますが、
間違っていましたら指摘をお願い致します。
以下のように、List<IProduct>
の変数products
を定義し、
products.AddRange()
するとコンパイルが通りました。
C#
1// Amazonの商品をリストに追加 2var amazonProducts = new List<AmazonProduct>(); 3amazonProducts.Add(new AmazonProduct() { Asin = "Asin001", Name = "Name001", Price = 100 }); 4 5// eBayの商品をリストに追加 6var ebayProducts = new List<EbayProduct>(); 7ebayProducts.Add(new EbayProduct() { OwnerCountry = "JPN", Name = "Name002", Price = 200 }); 8 9var products = new List<IProduct>(); 10// 問題なくコンパイルが通る 11products.AddRange(amazonProducts); 12products.AddRange(ebayProducts);
Ⅳ. 補足情報(言語/FW/ツール等のバージョンなど)
.NET Core 1.0
回答2件
あなたの回答
tips
プレビュー