如何访问子类的属性

时间:2019-01-14 17:05:25

标签: c# class abstract-class

我有1个抽象类'Book'和2个子类'Comic'和'Novel',它们从第一个抽象类扩展而来。 在主要方法中,我必须创建一系列用于存储漫画和小说实例的书籍。

我的问题是我不知道如何获得“漫画”类的可变价格。 我在“漫画”类中有吸气剂,但只能访问父类“书”中的变量。

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.
   }

   ...
}

2 个答案:

答案 0 :(得分:1)

首先,您需要更改价格字段的可访问性,或创建一个公共财产,然后,您可以使用模式匹配功能(在我写的“如果”行上进行检查漫画类型之后的 c ,如果'is'复选框为true,则将该书转换为漫画,并且您可以在'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.
    }
...
}

答案 1 :(得分:0)

在类范围之外无法访问私有变量(如Book类中所示)。这意味着,例如 book.title 将显示错误。

要使您的“价格”属性可用,我首先建议将变量带到Book类中(因为可以假设所有书或派生类都应有价格)。 之后,您可以如下创建公共属性:

public double Price { get; set; }

当尝试访问您的图书集中的对象时,这将显示Price属性。

要通过您的主要方法访问您的价格,可能需要以下类似内容:

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 ++)相同的规则:

公共:可以在使用该类实例的任何范围级别上访问。

私有:只能在类的范围内访问,而不能在类外部直接访问。