如何以正确的方式使用抽象方法?

时间:2013-05-14 05:50:50

标签: c# abstract-class

我将库系统实现为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(...)方法,那么抽象类的用途是什么?

3 个答案:

答案 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.AddItemRentalItem.AddItem不同,因为RentalItem无法调用它,并且两种方法都接受不同的参数。现在我们能做什么?

首先,如果不需要或逻辑上相同,请将MovieItem作为新类继承自RentalItem

其次,如果您需要继承,请让RentalItemMovieItem成为仅具有属性而非方法的实体。为了处理AddItem,你创建了另一个类,如RentalItemCollectionMovieItemCollection,它们在逻辑上彼此没有关系。

答案 2 :(得分:0)

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