2

我有一个关于多态性的问题。这里有3个简单的类:

public class Book
{
    public string Name;
}

public class Encyclopedia : Book
{
    public int Volume;
}

public class Library
{
    public Book[] Books;
}

我像这样实例化的库类:

private void btnMakeLibrary_Click(object sender, EventArgs e)
{
    Book[] books = new Book[3];
    books[0] = new Book();
    books[0].Name = "Book Name 1";
    books[1] = new Book();
    books[1].Name = "Book Name 2";
    books[2] = new Encyclopedia();
    books[2].Name = "Encyclopedia 1";
    ((Encyclopedia)books[2]).Volume = 10;

    Library library = new Library();
    library.Books = books;
}

由 Book 类型组成的数组由 Encyclopedia 类型填充。为什么这可能?我可以理解,如果 Encyclopedia 类型的数组由它的一个基类填充,是否是另一种方式。也许我把它与之前关于基类和子类之间转换的问题混淆了。

4

2 回答 2

4

我不确定您对哪一部分感到困惑:

  1. 数组必须是书籍数组。百科全书是一种书籍。因此,书籍数组可以包括任何类型的书籍,包括百科全书。相反,一系列百科全书不能包括任何旧书,因为我们希望它们都是具有体积属性的百科全书。

  2. 第三本书是百科全书,你投到它。你可以在上面写着的那一行看到这个((Encyclopedia)books[2]).Volume = 10;。这是强制转换,这是允许的,但不一定鼓励,因为操作可能在运行时失败。想象一下,如果你这样写:((Encyclopedia)books[1]).Volume = 10;. 那将编译但在运行时失败。

于 2013-06-18T14:41:45.970 回答
1

基类总是可以包含对其子类的引用,因为子类总是包含基部分。这就是您可以将 Book 的任何派生类分配到作为书籍集合的 Library 的原因。

百科全书就是一本书——这句话永远成立。我希望这能消除你的困惑。

于 2013-06-18T16:50:25.470 回答