为什么这样做?遗产

时间:2011-09-20 01:56:55

标签: c# inheritance constructor

这里没有问题,只需要解释一下它是如何工作的。

我正在为我的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;
        }
    }
}

4 个答案:

答案 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不会“保护”它在派生类中被覆盖(使用overridenew)。

答案 1 :(得分:1)

1。)它使用的Book构造函数不带参数

Book xmlBook = new Book();

其余的只是分配公共财产。

2。)base()正在调用基类的构造函数 - 由于Publication构造函数没有任何参数,因此您不必(也不能)传递任何参数。请注意,在这种情况下,调用base()是可选的,因为基类提供了一个空构造函数。另请参阅"Using Constructors“作为参考。

3。)display()中的Book方法正在调用基类的display()方法作为其实现的一部分,这就是附加的原因输出。请注意,由于方法签名使用new public voidBook类中的方法仅在您使用Book引用时调用,通常您希望使用override。< / p>

答案 2 :(得分:1)

1)使用xmlBook,您可以调用不带参数的构造函数public Book(),然后设置各个字段。

2)在带有参数的Books的构造函数中,您可以使用某些参数调用base,即titlepublisherNameprice。另一种选择(你所拥有的)是设置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以获取更多信息。