在抽象类中使用非抽象方法和构造函数

时间:2013-12-09 14:32:01

标签: c# inheritance abstract-class

我是编程语言的初学者。我对抽象类有疑问。

抽象类无法实例化,那么在抽象类中使用非抽象方法和构造函数是什么?

请帮忙......

3 个答案:

答案 0 :(得分:2)

只有在派生类时才有意义。

您可能希望在基类中实现一些常用方法。此外,您可能希望在抽象类中初始化一些thinhgs,因此您需要一个构造函数。

看看这个例子:

abstract class Fruit
{
    private Logger log;

    // init private stuff
    public Fruit() 
    {
        this.log = new Logger("C:\\Temp");
    }

    // do common functionality
    public int CalculatePrice(double weight)
    {
       return weight * GetPricePerKilo();
    }

    // specific stuff must be implemented by derived classes
    public abstract double GetPricePerKilo();
}

class Apple : Fruit
{
    // must implement in non-abstract derived class
    public override double GetPricePerKilo()
    {
        return 4.30;
    }
}

答案 1 :(得分:1)

抽象类用于抽象某些行为,同时还强制您添加至少某种行为以使其成为实际对象。把它想象成公路车辆。您可以拥有一个包含非抽象函数RoadVehicle的抽象类Drive。如果你继承了抽象函数,让我们说一个具体的类Car,我们就可以访问Drive行为了。

如果您不想预定义行为,最好使用仅包含实现该接口应具有的每个类的方法(和属性)定义的接口。即我们可以有一个IVehicle接口,它有一个方法Move()。那么,陆地车辆,飞行器和水上车辆都以不同的方式移动,因此预定义行为是没有意义的,而在我们之前的情况下,行为是相同的,我们已经可以将该行为添加到抽象类中。

答案 2 :(得分:0)

抽象类在某些成员具有每个实现将独立处理的行为的情况下最有用。例如,考虑一个ReadableDoubleMatrix类,它有三个属性:

int Rows {get;};
int Columns {get;}
double this[int row, int column] {get;}

最简单的通用实现可能是一个ImmutableArrayBackedMatrix类,它包含一个double[,],它在构造类时被填充,但其他实现包含IdentityMatrix,其中包含size值[RowsColumns都返回size,而this[row, column]将返回row==column ? 1.0 : 0.0]。因为这些派生类没有共同的字段,所以基类包含任何一个都是毫无意义的。但是,没有任何字段,基类实例可以对这些属性做任何有意义的事情。

请注意,即使有人可以,例如让基类实现RowsColumns返回1,this返回0.0,代码可能在某些情况下找到这样的对象有用,没有任何原因代码应该想拥有这样一个项目的多个实例。即使代码经常需要这样的矩阵,并希望它与所有其他矩阵不同,但通常最好将密码类型用于此目的。