我将库系统实现为Exercise,因为我创建了一个抽象类:
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(...)方法,那么抽象类的用途是什么?
答案 0 :(得分:0)
使用抽象方法时,必须覆盖方法,这意味着您必须遵守抽象方法的原始签名。您无法在原始签名中添加或删除参数。 如果您需要更改签名,那么使用抽象方法
是不合适的答案 1 :(得分:0)
你试图抽象出两件不同的东西。添加RentalItem
是否与添加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
。
其次,如果您需要继承,请让RentalItem
和MovieItem
成为仅具有属性而非方法的实体。为了处理AddItem,你创建了另一个类,如RentalItemCollection
和MovieItemCollection
,它们在逻辑上彼此没有关系。
答案 2 :(得分:0)
方法签名必须保持不变才能使抽象类起作用。 如果Movie类中的addItem方法有更多参数,您可以通过更改其签名以接受List或Dictionary或其他一些集合来处理它,或者您可以将参数封装在名为RentalItemProperties的新类中。