Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在以下情况下,抽象类会比接口更好吗?_Vb.net_Oop - Fatal编程技术网

Vb.net 在以下情况下,抽象类会比接口更好吗?

Vb.net 在以下情况下,抽象类会比接口更好吗?,vb.net,oop,Vb.net,Oop,我有一个包含四个函数的接口。我有大约20个类实现这个接口。在每个类中,我都会看到很多重复的代码,例如,在每个类的开头都声明了常量。接口的方法实现(逻辑)基本相同。它包含重复的结构。在这种情况下,我可以通过实现抽象类而不是接口来消除大量重复类。我所追求的是能够将抽象类中的常用方法作为非抽象方法,然后需要自己实现的方法将被标记为可重写。我可以把常量和结构放在抽象类中吗?如果是这样的话,这将消除跨类的大量重复代码。在类中还有什么我应该注意的,作为我可能应该使用抽象类而不是接口的标志。实际上,在大多数情

我有一个包含四个函数的接口。我有大约20个类实现这个接口。在每个类中,我都会看到很多重复的代码,例如,在每个类的开头都声明了常量。接口的方法实现(逻辑)基本相同。它包含重复的结构。在这种情况下,我可以通过实现抽象类而不是接口来消除大量重复类。我所追求的是能够将抽象类中的常用方法作为非抽象方法,然后需要自己实现的方法将被标记为可重写。我可以把常量和结构放在抽象类中吗?如果是这样的话,这将消除跨类的大量重复代码。在类中还有什么我应该注意的,作为我可能应该使用抽象类而不是接口的标志。

实际上,在大多数情况下,两者都做是有意义的。创建一个接口并编写所有与该接口对话的客户端代码,但也创建一个实现该接口的抽象类。子类可以扩展抽象类,如果它们愿意,也可以不扩展。通过这种方式,您可以获得接口的灵活性和抽象类的便利性。

实际上,在大多数情况下,两者兼而有之是有意义的。创建一个接口并编写所有与该接口对话的客户端代码,但也创建一个实现该接口的抽象类。子类可以扩展抽象类,如果它们愿意,也可以不扩展。这样可以获得接口的灵活性和抽象类的便利性。

消除重复代码总是一个好主意。所以,是的,您应该将公共常量放入一个抽象类中(该类仍然可以并且应该实现接口)。但是,您应该考虑常数对于所有派生类是否真的很常见。
决不能仅仅因为某些继承者需要常量而将其放入抽象类中。这表明继承树中可能需要另一个抽象类。

消除重复代码总是一个好主意。所以,是的,您应该将公共常量放入一个抽象类中(该类仍然可以并且应该实现接口)。但是,您应该考虑常数对于所有派生类是否真的很常见。
决不能仅仅因为某些继承者需要常量而将其放入抽象类中。这表明继承树中可能需要另一个抽象类。

感谢您的快速回复。你有一个小例子吗?这对我来说都是新鲜事,我不是微软的人,所以我不知道任何vb.net的例子,但是Java API中有很多例子。例如,查看java.awt.event包中的XListener接口和XAdapter抽象类:感谢您的快速回复。你有一个小例子吗?这对我来说都是新鲜事,我不是微软的人,所以我不知道任何vb.net的例子,但是Java API中有很多例子。例如,看看java.awt.event包中的XListener接口和XAdapter抽象类:您能在实现抽象类的类中重写常量吗?这同样适用于属性等。不,不能重写常量,根据定义,常量是静态的。但是,您可以重写属性,因此,如果您的“常量”需要依赖于实现,那么它实际上应该是一个属性。您可以重写实现抽象类的类中的常量吗?这同样适用于属性等。不,不能重写常量,根据定义,常量是静态的。但是,您可以重写一个属性,因此如果您的“常量”需要依赖于一个实现,那么它实际上应该是一个属性。