如何访问子类的 属性

How to access property of a subclass

我有 1 个摘要 class 'Book' 和 2 个子classes 'Comic' 和 'Novel' 从第一个摘要 class 扩展而来。 在主要方法中,我必须创建书籍数组来存储漫画和小说的实例。

我的问题是我不知道如何访问 class 'Comic' 的可变价格。 我在 'Comic' class 中有吸气剂,但我只能访问属于父 class 'Book'.

的变量
abstract class Book
{
    private string title;
    private string author;
    ...
}

class Comic : Book
{
    private double price;
    ...
}



static void Main(string[] args) {
   ...
   for (int i = 0; i < books.Length; i++) {
        if (books[i] is Comic)
           Console.WriteLine("Price of comic is..."); 
           // Here i want to access books[i].price or books[i].Price with getter.
   }

   ...
}

首先,您需要更改价格字段的可访问性,或者创建一个public 属性,然后,您可以使用模式匹配功能(在 'if' 行检查它,我在 Comic 类型之后写了一个 c,如果 'is' 检查为真,则将 Book 转换为 Comic,您可以在 'if' 语句中使用该变量):

static void Main(string[] args) {
...
    for (int i = 0; i < books.Length; i++) {
        if (books[i] is Comic c)
           Console.WriteLine("Price of comic is..." + c.price); 
           // Here i want to access books[i].price or books[i].Price with getter.
    }
...
}

私有变量(如您的书 class 中所示)在 class 范围之外不可访问。这意味着,例如 book.title 将显示错误。

为了使您的 "price" 属性 可用,我首先建议将该变量改为 Book class(因为可以假设所有书籍或派生的 classes 应该有一个价格)。 之后你可以创建一个 public 属性 如下:

public double Price { get; set; }

这将在尝试访问您的藏书中的对象时公开价格 属性。

至于在您的主要方法中访问您的价格,类似以下的方法可能适合:

static void Main(string[] args) {
...
    for (int i = 0; i < books.Length; i++) {
        if (books[i] is Comic)
           Comic c = books[i] as Comic;
           Console.WriteLine("Price of comic is..." + c.Price); 
    }
...
}

很快,C# 中的访问器往往遵循与许多语法相似的语言(例如 Java 或 C++)相同的规则:

Public : 可以在使用 class.

实例的任何范围级别访问

Private :只能在class范围内访问,不能在class之外直接访问。