这里没有问题,只需要解释它是如何工作的。
我正在为我的 C# 类(class)做家庭作业,我设法按照教授提供的代码示例自行完成。问题是我不明白它是如何工作的。以下是让我感到困惑的事情:
首先,为什么我需要使用 xmlBook.Title = "XML Primer Plus";
而不是 Book clrBook = new Book("CLR via C#", ... ")
反之亦然。
其次,为什么我在使用: base()
时不需要任何参数?
第三,使用new public void display()
覆盖如何只增加输出,而不是完全修改原来的protected void display()
?我猜是因为原始的 diplay()
受到了保护?
请澄清
问候。
Main.cs
using System;
namespace Lab_4
{
class Program
{
static void Main(string[] args)
{
Book xmlBook = new Book();
xmlBook.Title = "XML Primer Plus";
xmlBook.AuthorFirstName = "Nicolas";
xmlBook.AuthorLastName = "Chase";
xmlBook.Price = 44.99F;
xmlBook.PublisherName = "Sams Publishing";
Book clrBook = new Book("CLR via C#",
"Jeffrey",
"Richter",
59.99f,
"Microsoft Press");
Console.WriteLine("=== xmlBook ===");
xmlBook.display();
Console.WriteLine();
Console.WriteLine("=== clrBook ===");
clrBook.display();
}
}
}
Publication.cs
using System;
namespace Lab_4
{
public class Publication
{
string publisherName, title;
float price;
public Publication()
{
}
public Publication(string title,
string publisherName,
float price)
{
Title = title;
PublisherName = publisherName;
Price = price;
}
public float Price
{
set
{
price = value;
}
}
public string PublisherName
{
set
{
publisherName = value;
}
}
public string Title
{
set
{
title = value;
}
}
protected void display()
{
Console.Write("{0}\n{1}\n{2}\n", title, publisherName, price);
}
}
}
Book.cs
using System;
namespace Lab_4
{
public class Book : Publication
{
string authorFirstName, authorLastName;
public Book()
{
}
public Book(string bookTitle,
string firstName,
string lastName,
float bookPrice,
string publisherName)
: base()
{
Title = bookTitle;
AuthorFirstName = firstName;
AuthorLastName = lastName;
Price = bookPrice;
PublisherName = publisherName;
}
public string AuthorFirstName
{
get
{
return authorFirstName;
}
set
{
authorFirstName = value;
}
}
public string AuthorLastName
{
get
{
return authorLastName;
}
set
{
authorLastName = value;
}
}
new public void display()
{
base.display();
Console.WriteLine("{0}", getAuthorName());
}
string getAuthorName()
{
return AuthorFirstName + " " + AuthorLastName;
}
}
}
最佳答案
First of all, how come I need to use xmlBook.Title = "XML Primer Plus"; instead of Book clrBook = new Book("CLR via C#", ...") and vice-versa as constructors.
如果你愿意,你可以自由交换它们。这两个选项都有效,这就是该代码试图展示的内容。
Book
类有多个构造函数。从类外部的代码(比如在您的 Main
方法中),您可以调用标记为 public
的类的任何构造函数。
调用 new Book();
时需要设置属性的原因是构造函数没有设置类的属性。当您调用 new Book("CLR via C#", "Jeffrey", "Richter", etc);
时,您正在调用确实设置属性的构造函数。
Second, why I don't have to have any parameters when using : base()?
基类 (Publication
) 也有两个构造函数。当调用 base()
时,您正在调用不带参数的 Publication
的构造函数。
当您调用派生类的构造函数时,总会调用基类的某些构造函数。如果您没有明确指定要调用哪个基类的构造函数(通过调用 base()
或 base("some title", "some publisher name", 0.0f/* some price */)
),然后默认调用无参数构造函数(即 public Publication()
)。
Third, how does overwrite by using new public void display() only adds output, instead of completely modifying original protected void display()? I guess because the original diplay() is protected?
它与被保护没有任何关系。尝试将其更改为 public
,您将看到相同的行为。
它“添加”行为的方式是在基类中实际调用该函数。 base.display();
行调用了该函数。如果该行不存在,基类的函数将被有效地“替换”。
protected
只有一件事。这意味着您不能从外部代码调用它 - 您只能从同一个类(从 Publication
)和派生类(Book
)内部调用它. protected
不会“保护”它免于在派生类中被覆盖(使用 override
或 new
)。
关于c# - 为什么这行得通?遗产,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7479250/