【问题标题】:Abstract class fields redundancy C#抽象类字段冗余 C#
【发布时间】:2016-10-22 15:43:58
【问题描述】:

我有基本抽象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 类中的title、barCode、price 吗?这个可以换吗

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

重复建设少?

【问题讨论】:

  • 只是一个注释。你有 fields 而不是 properties。属性应该有get 和/或set。
  • 请使用decimal(或整数)而不是double来表示价格。
  • 我会考虑用接口替换抽象类。
  • 您已经有一个接受的答案,但还要考虑:1)您有受保护的字段。有没有一个好的、伟大的、难以置信的不可避免的理由? 2)抽象类中的公共构造函数?你可能想让它受到保护(只是为了意图,没有其他合理的区别) 3)为什么重量是一个字符串? 4)您可以考虑只使用一个无参数构造函数,并让调用者逐步填充对象 PROPERTIES(如果适用)。如果不是,至少您可能希望将它们设为只读属性(否则您将遇到无参数 ctor 的相同问题,但没有优势)
  • 我用排名代替了体重。我注意到了。这不是我的代码。这不是字符串。此等级用于通过 LINQ 进行排序。我改变了它。它可以与字符串一起使用,但我想把它做好。对受保护代码的回答相同,4) 是否有一些具体示例?

标签: c# inheritance abstract


【解决方案1】:

不,此代码不是多余的。您必须将值传递给 Book 构造函数和 base 构造函数。

我看到你在Book 构造函数中分配了weight。如果您愿意,您也可以对其他Title、BarCode 和Price 执行相同的操作。那么您的 Goods 构造函数将为空。但这意味着Goods 的每个实现都必须这样做(如果有更多的逻辑而不是简单的分配,这将是一件坏事)..

【讨论】:

  • 你的代码不是多余的,你不能让你的constructor更短。这就是 C# sintax 的样子。
  • 我明白了。 Books 构造函数从基础 Goods 构造函数继承值作为基础。它们从基础构造函数传递到继承的构造函数。而不是每次都填充它们。
【解决方案2】:

我应该将存在于 Goods 类中的 title、barCode、price 写两次吗? 我可以用更少的重复结构来代替这个吗?

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

这是您的构造函数 [方法] 的声明,指定它采用的参数。

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

这是基类的构造函数的调用,将参数传递给 this 构造函数。

    : base(title, barCode, price)

这是绝对必要的,因为您的基类只能使用提供的带有三个参数的构造函数来构造。您必须提供这些参数,可以通过传递给此构造函数的参数,也可能通过派生它们,如

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

(不确定这样的函数函数是如何工作的,但希望你能明白我的意思)。

【讨论】:

  • 谢谢。调用。我在另一个答案中理解,但谢谢!单词调用。
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2022-01-19
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多