クラスがインターフェイスから継承されている場合、List <Interface>オブジェクトのプロパティにアクセスするにはどうすればよいですか?

TheMostEpic

さて、ここに問題があります。プロパティNameを含むインターフェイスIBookがあります。IBookから継承し、独自のプロパティGenreを追加する2つのクラスがあります。辞書またはリストを作成し、そこにすべての種類の本を追加して、文字列とそのプロパティでアクセスしたいので、辞書にしました。この例では、books ["LOTR"]。Nameにはアクセスできますが、books ["LOTR"]。Genreにはアクセスできません。これは、NameがIBookインターフェイスのプロパティであるのに対し、GenreはIBookから継承するクラスのプロパティであるためです。

ディクショナリまたはリストをインターフェイスタイプで機能させ、継承するすべてのクラスプロパティにもアクセスできるようにすることは可能ですか、それとも配列などを使用する必要がありますか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp124
{
interface IBook
{
    string Name { get; set; }
}

public class FantasyBook:IBook
{
    string name;
    string genre;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    public string Genre
    {
        get { return genre; }
        set { genre = value; }
    }
}
public class HorrorBook : IBook
{
    string name;
    string genre;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    public string Genre
    {
        get { return genre; }
        set { genre = value; }
    }
}
class Program
{
    static void Main(string[] args)
    {
        FantasyBook LordOfTheRings = new FantasyBook();
        HorrorBook Frankenstein = new HorrorBook();
        Dictionary<string, IBook> books = new Dictionary<string, 
IBook>();

        books.Add("LOTR", LordOfTheRings);
        books.Add("Frankenstein", Frankenstein);
        books["LOTR"].Name = "Lord Of The Rings";
        books["LOTR"].Genre = "Fantasy";
        Console.ReadLine();
    }
}
}

コメントはほとんど要点です-コンパイラはIBook(宣言したので)利用可能なメンバーを調べ、そこで定義されていないプロパティにアクセスしようとして足を撃たないので、それを行うことはできません。これは静的型チェックです。

しかし、型の安全性とパフォーマンスを気にしないことを少し想像してみましょう。結局のところ、あなたには選択肢があります。並べ替えの...あなたはまだあなたの特定を放棄しなければならないだけでなく、IBookためにdynamic

interface IBook {
    string Name { get; set; }
}

public class FantasyBook : IBook
{
    public string Name { get; set; }
    public string Genre { get; set; }
}
public class HorrorBook : IBook
{
    public string Name {get;set;}
    public string Genre {get;set;}
}

public class BadaBook : IBook // so I added this new class that does not implement Genre to illustrate a point
{
    public string Name { get; set; }
}
static void Main(string[] args)
    {
        var LordOfTheRings = new FantasyBook();
        var Frankenstein = new HorrorBook();
        var Badaboom = new BadaBook();
        Dictionary<string, dynamic> books = new Dictionary<string, dynamic>();

        books.Add("LOTR", LordOfTheRings);
        books.Add("Frankenstein", Frankenstein);
        books.Add("Badaboom", Badaboom);
        books["LOTR"].Name = "Lord Of The Rings";
        books["LOTR"].Genre = "Fantasy";
        books["Badaboom"].Name = "We can easily assign Name as it is defined. No problem here";
        books["Badaboom"].Genre = "But we will miserably fail here"; // RuntimeBinderException: 'UserQuery.BadaBook' does not contain a definition for 'Genre'

        Console.ReadLine();
    }

さらに読むためにダイナミックチェックしてくださいこれには、私の例で概説したリスクとパフォーマンスのペナルティが伴います。それ自体は悪いことではありません、それは適度に取られる必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ