1

我将图书馆系统实现为练习,因为我创建了一个抽象类:

 public abstract class RentalItem
{
    .....  
    public RentalItem() { }
    public RentalItem(string itemID, string title, int qty,float price, PeriodType period) {
        ItemID = itemID;
        Title = title;
        No_Of_Copies = qty;
        Period = period;
    }
    public abstract void addItem(string itemId, string title, int no_of_copies,float price,PeriodType p);
   .....
}

之后,我创建了 MovieItem 类,它继承了 RentalItem 类:现在这个类有额外的字段。如下 :

public Movie(string itemId, string title, int no_of_copies, float price, PeriodType p, MovieType type, string actor, string director)
        : base(itemId, title, no_of_copies, price, p)
    {

        this.Type = type;
        this.Actors = actor;
        this.Director = director;
    }


public override void addItem(string itemId, string title, int no_of_copies,float price,PeriodType p){};

但实际上我想实现 addItem 方法,它需要基本参数+附加参数,如下所示:

public void addItem(string itemId, string title, int no_of_copies, float price, PeriodType p, MovieType type, string actor, string director)

那么如何使用抽象方法呢?如果我正在实现自己的 addItem(...) 方法,那么抽象类有什么用?

4

3 回答 3

0

使用抽象方法时,您必须重写该方法,这意味着您必须遵守抽象方法的原始签名。您不能在原始签名中添加或删除参数。如果您需要更改签名,那么使用抽象方法是不合适的

于 2013-05-14T05:55:06.430 回答
0

您正在尝试抽象两件不同的事情。添加 aRentalItem是否与添加 a 相同MovieItem?如果是,那么您可以抽象该方法。否则,最好不要抽象它。

编辑:

也许我的陈述不清楚。现在看一下这段代码的例子:

RentalItem rent = new RentalItem();
rent.AddItem(..params);

是类中AddItem方法的使用RentalItem。现在对于 MovieItem 类:

MovieItem mv = new MovieItem();
mv.AddItem(..params);

现在看起来不错。但是,因为MovieItem是由 继承的RentalItem,所以我们可以这样实现:

RentalItem item = new MovieItem();
item.AddItem(..params);

这就是问题所在。我们可以看到 与MovieItem.AddItem不同RentalItem.AddItem,因为它不能被 调用RentalItem,并且两种方法都接受不同的参数。现在我们能做什么?

首先,如果不需要或者逻辑上不一样,让 .MovieItem作为一个新的类,而不是继承自RentalItem.

其次,如果你需要继承,让RentalItemandMovieItem成为只有属性而不是方法的实体。并且为了处理 AddItem,您创建了另一个类RentalItemCollectionMovieItemCollection并且在逻辑上彼此之间没有关系。

于 2013-05-14T05:57:19.720 回答
0

方法签名必须保持不变才能使抽象类工作。如果您的 Movie 类的 addItem 方法有更多参数,您可以通过更改其签名以接受 List 或 Dictionary 或其他一些集合来处理它,或者您可以将参数封装在一个名为 RentalItemProperties 的新类中。

于 2013-05-14T09:23:02.317 回答