【发布时间】:2019-12-12 21:28:47
【问题描述】:
好的,问题来了。我有一个接口 IBook,其中包括属性名称。有两个类从 IBook 继承并添加自己的属性 Genre。我想创建一个字典或列表并在那里添加各种书籍并通过字符串及其属性访问它们,所以我将它设为字典。在示例中,我可以访问 books["LOTR"].Name 但不能访问 books["LOTR"].Genre,这可能是因为 Name 是 IBook 接口的属性,而 Genre 是从 IBook 继承的类的属性。
是否可以让 Dictionary 或 List 与接口类型一起工作,并且仍然能够访问所有继承类属性,还是应该使用数组或其他东西?
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();
}
}
}
【问题讨论】:
-
如果他们都有名字和流派,那你为什么不在界面中添加流派呢?如果您投射
(books["LOTR"] as FantasyBook).Genre,您可以访问所有不在界面中的属性 -
“是否可以使 Dictionary 或 List 与接口类型一起工作,并且仍然能够访问所有继承类属性”不不可能。 “或者我应该使用数组还是什么?”问题不在于包含 IBook 的集合,所以再次使用数组不会解决任何问题。您的问题的解决方案可以简单地通过将
Genre作为IBook定义的一部分来解决,因为这样做很有意义。为什么你一开始没有考虑到这一点?设计理由是什么? -
您可以引入基本抽象类,例如带有
Name属性的BaseBook(或将其添加到接口),然后将字典值转换为该类型以访问Name跨度> -
按流派命名接口并具有“流派”属性很麻烦。味道不好。
-
顺便说一句,看看auto properties。这个问题闻起来像是一位 2003 年学习 C# 的教授布置的作业。
标签: c# arrays list dictionary interface