这里没有问题,只需要解释一下它是如何工作的。
我正在为我的C#课做家庭作业,我自己通过遵循教授提供的代码示例自行完成。问题是我不知道它是如何工作的。以下是困扰我的事情:
首先,为什么我需要使用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;
}
}
}
答案 0 :(得分:2)
首先,为什么我需要使用xmlBook.Title =“XML Primer Plus”;而不是Book clrBook = new Book(“CLR via C#”,...“),反之亦然作为构造函数。
如果您愿意,可以随意更换它们。这两个选项都有效,这是该代码试图演示的内容。
Book
类有多个构造函数。从类外部的代码(例如在Main
方法中),您可以调用标记为public
的类的任何构造函数。
调用new Book();
时需要设置属性的原因是因为该构造函数未设置类的属性。当您致电new Book("CLR via C#", "Jeffrey", "Richter", etc);
时,您正在调用 设置属性的构造函数。
其次,为什么我在使用时不需要任何参数:base()?
基类(Publication
)也有两个构造函数。在调用base()
时,您正在调用不带参数的Publication
构造函数。
当您为派生类调用构造函数时,将始终调用基类的某些构造函数。如果没有显式指定要调用哪个基类的构造函数(通过调用base()
或base("some title", "some publisher name", 0.0f /* some price */)
),那么默认情况下将调用无参数构造函数(即public Publication()
)
第三,如何使用new public display display()覆盖只添加输出,而不是完全修改原始的protected void display()?我猜是因为原来的diplay()受到了保护?
它与受保护没有任何关系。尝试将其更改为public
,您将看到相同的行为。
它“添加”行为的方式是通过在基类中实际调用该函数。行base.display();
调用该函数。如果那条线不在那里,基类的功能将被有效地“替换”。
protected
只涉及一件事。这意味着你不能从外部代码调用它 - 你只能从同一个类(从Publication
内)和派生类(Book
内部)调用它。 protected
不会“保护”它在派生类中被覆盖(使用override
或new
)。
答案 1 :(得分:1)
1。)它使用的Book
构造函数不带参数
Book xmlBook = new Book();
其余的只是分配公共财产。
2。)base()
正在调用基类的构造函数 - 由于Publication构造函数没有任何参数,因此您不必(也不能)传递任何参数。请注意,在这种情况下,调用base()
是可选的,因为基类提供了一个空构造函数。另请参阅"Using Constructors“作为参考。
3。)display()
中的Book
方法正在调用基类的display()
方法作为其实现的一部分,这就是附加的原因输出。请注意,由于方法签名使用new public void
,Book
类中的方法仅在您使用Book
引用时调用,通常您希望使用override
。< / p>
答案 2 :(得分:1)
1)使用xmlBook
,您可以调用不带参数的构造函数public Book()
,然后设置各个字段。
2)在带有参数的Books
的构造函数中,您可以使用某些参数调用base
,即title
,publisherName
和price
。另一种选择(你所拥有的)是设置Books构造函数本身的所有字段。
3)Books.display()
将输出添加到Publication.display()
,而不是替换它,因为它会调用base.display()
。
答案 3 :(得分:1)
第一个问题
出版物有公共标题属性。本书是出版物,因此您可以致电
Book xmlBook = new Book();
xmlBook.Title = "XML Primer Plus";
第二个问题
Publication有一个没有任何参数的构造函数。所以你可以从Book类中将它称为base()。
public Publication()
{
}
第三个问题
Book类中的显示方法调用Publication类中的Display方法。请注意,如果使用new modifier而不是override,派生类中的方法不会覆盖基类中的方法,它只会隐藏它。请查看this thread以获取更多信息。