抽象类字段冗余 C#

14

我有一个基础抽象类Goods,并继承了Book类。


abstract class Goods
{
    public decimal weight; 
    string Title, BarCode;
    double Price;
    public Goods(string title, string barCode, double price)
    {
        Title = title;
        BarCode = barCode;
        Price = price;
    }
}

abstract class Book : Goods
{
    protected int NumPages;
    public Book(string title, string barCode, double price, int numPages)
        : base(title, barCode, price)
    {
        NumPages = numPages;
        weight = 1;
    }
    public override void display()
    {
        base.display();
        Console.WriteLine("Page Numbers:{0}", NumPages);
    }

}

我需要在Goods类中写两次titlebarCodeprice吗?还是说我可以替换它们?

 public Book(string title, string barCode, double price, int numPages)
        : base(title, barCode, price)

有没有更少冗余的结构?


8
注意,你有的是“字段”而不是“属性”。属性应该具有get和/或set方法。 - Dovydas Šopa
6
请使用“十进制数”(或整数)代替“双精度浮点数”来表示价格。 - CodesInChaos
4
我会考虑用接口替换抽象类。 - CodesInChaos
1
您已经有了一个被接受的答案,但请考虑以下几点:1)您有受保护的字段。是否有很好、伟大、不可避免的理由呢?2)抽象类中的公共构造函数?您可能希望将其设置为受保护的(仅出于意图,没有其他合理的区别)。3)为什么重量是一个字符串?4)您可以考虑只有一个无参数构造函数,并让调用者逐步填充对象属性(如果适用)。如果不行,您至少可以将它们设置为只读属性(否则,您将面临与无参数 ctor 相同的问题,但没有优势)。 - Adriano Repetti
我用“排名”替换了“重量”。我注意到这不是我的代码,而且这不是字符串。这个“排名”是用于通过LINQ排序的。我修改了它。它可以与字符串一起使用,但我想做正确的事情。对于受保护的代码,同样的答案,有没有一些特定的例子来回答第4个问题? - streamc
根据编辑历史记录,它包括保护字段和字符串,但现在已经修复。例如?生成的EF代码以及WPF / WinForms控件的使用(仅举两个例子)。 - Adriano Repetti
2个回答

17

不,这段代码并不是冗余的。你必须向 Book 构造函数和 base 构造函数都传递参数。

我看到在 Book 构造函数中赋值了 weight。如果你愿意,也可以为其他属性如 TitleBarCodePrice 赋值。这样你的 Goods 构造函数就是空的了。但这意味着每个实现 Goods 的类都需要这么做(如果还有更多的逻辑操作,那么这将是一个坏事)。


8
你的代码不冗余,也不能让你的构造函数变得更短。这是C#语法的写法。 - Dovydas Šopa
1
我明白了。Books构造函数从基本的Goods构造函数继承值,作为基础,并且它们从基础构造函数传递到继承的构造函数中。这样就不用每次都填写它们了。 - streamc

2

在 Goods 类中,我需要将 title、barCode 和 price 再写一遍吗?有没有更少冗余的构造方法可以替代它们?

这段代码中没有“冗余”。

这是构造方法(constructor)的声明,指定了它所需的参数。

public Book(string title, string barCode, double price, int numPages)

这是调用基类构造函数并将传递给这个构造函数的参数传递的过程。
    : base(title, barCode, price)

这是非常必要的,因为您的基类只能使用提供了三个参数的构造函数进行构造。您必须提供这些参数,可以通过传递给此构造函数的参数或者通过派生它们来实现。

    : base(title, barCode, priceDerivedFrom( title, barCode ) )

(不确定这样的函数将如何起作用,但希望你能看到我的观点。)

谢谢。调用。我在另一个答案中理解了,但还是谢谢!调用词。 - streamc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接