【问题标题】:Why is the override accessor being skipped over?为什么会跳过覆盖访问器?
【发布时间】:2014-05-04 00:26:21
【问题描述】:

我正在学习 C#(不是家庭作业)。不知道为什么我的 TextBook 和 CoffeeTableBook 子类中跳过了我的“公共新双倍价格”。我认为这是由于我的构造函数,因为这是在退出类之前执行的最后一行代码。还没有学到太花哨的东西,寻求简单。谢谢。

namespace BookDemo
{
class Program
{
    static void Main()
    {
        Book book1 = new Book (123, "BOOK: The Blue Whale", "Liam Smith", 15.99);
        Book book2 = new Book(456, "BOOK: The Blue Whale 2", "Liam Smith", 35.00);
        TextBook book3 = new TextBook(789, "TEXTBOOK: Math 101", "Bob Taylor", 1000.00, 10);
        CoffeeTableBook book4 = new CoffeeTableBook(789, "TEXTBOOK: Math 101", "Molly Burns", 0.10);

        Console.WriteLine(book1.ToString());
        Console.WriteLine(book2.ToString());
        Console.WriteLine(book3.ToString());
        Console.WriteLine(book4.ToString());
        Console.ReadLine();
    }

    class Book
    {
        private int Isbn { get; set; }
        private string Title  { get; set; }
        private string Author { get; set; }
        protected double Price { get; set; }

         //Book Constructor
        public Book(int isbn, string title, string author, double price)
        {
            Isbn = isbn;
            Title = title;
            Author = author;
            Price = price;
        }

        public override string ToString()
        {
            return("\n" + GetType() + "\nISBN: " + Isbn + "\nTitle: " + Title + "\nAuthor: " + Author + "\nPrice: " + Price.ToString("C2"));
        }
    }

    class TextBook : Book
    {
        private const int MIN = 20;
        private const int MAX = 80;
        private int GradeLevel { get; set; }

        //TextBook Constructor
        public TextBook(int isbn, string title, string author, double price, int grade) : base (isbn, title, author, price)
        {
            GradeLevel = grade;
        }

        public new double Price
        {
            set
            {
                if (value <= MIN)
                    Price = MIN;
                if (value >= MAX)
                    Price = MAX;
                else
                    Price = value;
            }
        }    
    }

    class CoffeeTableBook : Book
    {
        const int MIN = 35;
        const int MAX = 100;

        public new double Price  // min 35, max 100
        {                
            set
            {
                if (value <= MIN)
                    Price = MIN;
                if (value >= MAX)
                    Price = MAX;
                else
                    Price = value;
            }
        }

        //CoffeeTable Book Constructor
        public CoffeeTableBook(int isbn, string title, string author, double price) : base (isbn, title, author, price)
        {
        }
    }
}
}

【问题讨论】:

标签: c# inheritance overriding


【解决方案1】:

new 关键字隐藏了原始属性。因为您的 Book 类具有 protected Price 属性,而 TextBook 类具有 public 属性,所以编译器将它们识别为 2 个不同的属性,即TextBook 类中的一个作为全新的不相关属性。当访问Price 时,你仍然会得到来自基类的价格(Book

尝试改用virtualoverride,并保持访问修饰符一致(它们应该公开)

class Book
{
    ...
    public virtual double Price { get { return price; } set { price = value; } } //Property
    protected double price; //Backing Field
    ...
}
class TextBook : Book
{
    ...
    public override double Price
    {
        set
        {
            if (value <= MIN)
                price = MIN;
            if (value >= MAX)
                price = MAX;
            else
                price = value;
        }
    }    
    ...
}

Override/Virtual vs New 上查看另一个问题的更多信息。具体来说,答案中的这张图:

【讨论】:

  • 感谢您的回复。这就是我最初拥有的,但它给了我一个堆栈溢出。另外,父书类中的价格不应该受到保护吗?谢谢。
  • 值得一提的是,代码使用了Book中定义的属性,因为它是在Book构造函数中赋值的。
  • @JLT,看看我的编辑,当使用属性来处理逻辑时(因为你的 TextBook 属性不再是自动属性)你需要使用私有或受保护的字段来存储中的值,以及访问它的属性。 (因为设置价格,会调用set,然后再设置,无限循环)
  • 谢谢,西拉尔。这是有道理的,而且成功了!我的 MAX 价格有效,但是当我将价格更改为低于 MIN 时,它并没有将其设置为 MIN 值。我还将子类常量的 int 更改为 double。我希望我正确使用构造函数,似乎是重复的。谢谢。
  • 应该可以,我不知道为什么不行。如果您担心重复代码,请将MIN, MAX, and Price`(带有逻辑)移动到您的Book 类。确保 MINMAX 不再是 const。将它们设为readonly 并在每个继承类的构造函数中分配它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多