从设计意图上区分继承和实现
很久以来一直发现很多人根本就分不清什么是继承和实现。 这.NET 中继承是针对抽象类的,实现时针对接口的。所以我们就针对接口和抽象类来说吧。在我的项目中,我发现好多组员根本没有理解继承和实现的概念,对于接口和抽象类的使用选择非常模糊,对他们来说接口和抽象类的区别就在于,接口的方法都是virtual,而抽象类的方法是可以有实现的。但这只是语法上的区别,如果你对接口和抽象类的理解也仅限于此,那么我只能不客气的说你对OO的理解也就仅限于语法层次。
要真正理解继承和实现,首先要理解接口和抽象类在设计中的作用。首先我们说接口,举个简单的例子吧:
public interface IReadable
{
StringRead(string fileName);
}
public interface IWritable
{
voidWrite(String fileName, String msg);
}
上面我定义了两个接口,简单起见我都只定义了一个方法。那么如果我们在选择让我们的一个class实现这个两个接口中任意一个时,我们的意图是什么呢?
我需要我的类具有可读(或者可写)的能力,强调的是类具有可读(或者可写)的能力。
那么抽象类呢?还是一样,先来段代码(毕竟我们都是程序员,代码看起来清楚、亲切):
public abstract class Reader
{
public abstract StringReader(string fileName);
}
这里我定义了一个抽象类,那么如果我们在选择让我们的一个class继承这个抽象类,那我们又是什么想法呢?
我的类本身就是一个Reader,只是我是一个Document Reader或者PDFReader,这里强调的是事物的本质抽象。
总结: 当然你可以把抽象类当接口来用,编译器是没有办法检查你的设计思路。因为编译器是指要求你的代码符合它的规范。但是对于设计来说,正确的区分继承和实现是非常重要的,这体现了你的设计意图和设计思想。
ps: 谢谢FrankYu的指正