c# - 为什么这行得通?遗产

标签 c# inheritance constructor

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

我正在为我的 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 不会“保护”它免于在派生类中被覆盖(使用 overridenew)。

关于c# - 为什么这行得通?遗产,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7479250/

相关文章:

c# - 在 Dispose() 中设置 obj = null(Nothing) 有什么意义吗?

java - 无法调用类中的方法

c++ - 更改构造函数中的初始化顺序

c# - 如何在 WPF 中动态创建数据网格?

c# - 如何在 C# 中使用带有继承的依赖注入(inject)

java - 私有(private)成员和继承

java - 如何使用 JavaParser 识别构造函数?

javascript - 用 Javascript 中的对象填充数组

c# - 尝试实现一种可以比较任意两个列表但总是返回 false 的方法

c++ - 更改派生类继承的内容