我是编程语言的初学者。我对抽象类有疑问。
抽象类无法实例化,那么在抽象类中使用非抽象方法和构造函数是什么?
请帮忙......
答案 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
值[Rows
和Columns
都返回size
,而this[row, column]
将返回row==column ? 1.0 : 0.0
]。因为这些派生类没有共同的字段,所以基类包含任何一个都是毫无意义的。但是,没有任何字段,基类实例可以对这些属性做任何有意义的事情。
请注意,即使有人可以,例如让基类实现Rows
和Columns
返回1,this
返回0.0,代码可能在某些情况下找到这样的对象有用,没有任何原因代码应该想拥有这样一个项目的多个实例。即使代码经常需要这样的矩阵,并希望它与所有其他矩阵不同,但通常最好将密码类型用于此目的。