[英]Why does this work? Inheritance
这里没有问题,只需要解释它是如何工作的即可。
我当时在为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;
}
}
}
首先,为什么需要使用xmlBook.Title =“ XML Primer Plus”; 而不是Book clrBook = new Book(“ CLR via C#”,...“),反之亦然。
如果愿意,您可以自由交换它们。 任一个选项都有效,这就是该代码试图演示的内容。
Book
类有多个构造函数。 从类外部的代码(例如在Main
方法中),您可以调用标记为public
的类的任何构造函数。
调用new Book();
时需要设置属性的原因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()
)。
第三,如何使用新的公共void display()覆盖仅添加输出,而不是完全修改原始受保护的void display()? 我猜是因为原始的diplay()受保护了吗?
它与被保护没有任何关系。 尝试将其更改为public
,您将看到相同的行为。
它“添加”行为的方式是通过在基类中实际调用该函数。 行base.display();
调用该函数。 如果该行不存在,则将有效地“替换”基类的功能。
protected
手段只有一件事。 这意味着您不能从外部代码中调用它-您只能从同一类(在Publication
内)和派生类( Book
)内调用它。 protected
不会“保护”它以免在派生类中被覆盖(使用override
或new
)。
1.)使用Book
的构造函数,因此不带任何参数
Book xmlBook = new Book();
剩下的只是分配公共财产。
2.) base()
正在调用基类的构造函数-由于Publication构造函数没有任何参数,因此您不必(也不能)传递任何参数。 请注意,在这种情况下,调用base()
是可选的,因为基类提供了一个空的构造函数。 另请参见“使用构造函数 ”作为参考。
3.) display()
在方法Book
是调用display()
基类的方法,其实现的一部分,这就是为什么有附加的输出。 请注意,由于方法签名使用的是new public void
,因此仅在通过Book
引用使用时,才调用Book
类中的方法,通常,您想使用override
。
1)使用xmlBook
,您可以调用不带参数的构造函数public Book()
,然后设置各个字段。
2)在带参数的Books
的构造函数中,您可以使用一些参数来调用base
,即title
, publisherName
和price
。 一种替代方法(就是您所拥有的)是在Books构造函数本身中设置所有字段。
3) Books.display()
将输出添加到Publication.display()
,而不是替换输出,因为它调用base.display()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.