我有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.
}
...
}
答案 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 ++)相同的规则:
公共:可以在使用该类实例的任何范围级别上访问。
私有:只能在类的范围内访问,而不能在类外部直接访问。