使用抽象类与常规类的好处

问题描述 投票:19回答:8

我决定开始自己做小编码项目,专注于代码质量而不是代码数量,并对抽象类的使用有疑问。

现在我知道抽象类和接口之间的区别与最大的接口(我认为)是接口允许您只定义需要使用接口和类的类实现的方法,允许您同时定义方法和成员如果您愿意,可以使用默认方法。我的问题是使用抽象类与普通类的主要好处是什么?我能想到的两者之间唯一真正的区别是你不能创建一个抽象类的实例。这两者之间还有其他差异吗?

oop class abstract-class abstract
8个回答
17
投票

从设计的角度来看,最好简化一些事情。我认为简化事物的最佳方法是使用一个简单的类比。让我们用鸟类的比喻......

接口:当您要强制执行需要定义的某些功能时,请使用此选项。例如IBird与ScreamLikeABird和Fly(界面功能)签订了合同。但是你可以更具体,并拥有一个拥有Run合同的IOstrich。你可能还有一个有攻击合同的IHawk ......等等。

摘要:当您要强制执行基本功能并具有基本属性时,请使用此选项。例如Avian可能是鸟类的基类,可能有一个名为LayEgg的函数以及名为Age,Species,NumberOfChicks等的函数。这些东西不会/不应该改变鸟的行为,因为所有的鸟都会产卵......等等。但是当它以相同的方式尖叫或飞行时(有些甚至不会飞行)等等,并非所有的鸟听起来都是一样的....因此它们应该通过接口实现。


12
投票

除了无法创建抽象类的实例之外,某些语言可能支持在抽象类中使用抽象方法 - 类似于接口,抽象方法必须由继承自抽象类的类实现。

在我看来,抽象类的主要好处是是否有一些代码必须在相同类型的类之间共享。通常你可以使用一个接口,但有时这些类的功能可能重叠,你最终会得到代码重复。在这种情况下,您可以使用抽象类,只需将代码放在那里。


7
投票

在OO世界中,抽象类用于强加一些设计和实现约束。而已。在任何情况下,您都不必使用抽象类。但有些情况下你可能会更好地施加这些限制。那么它们是什么?让我们通过比较它的oo-counterparts来看看。

抽象类与接口

如您所知,这是继承的两个主要概念。

基本上,接口仅用于声明您愿意继承底层服务,就是这样。不包含任何实现,也没有任何功能。从这个意义上讲,界面是抽象的。这就是为什么它比设计约束更多的设计约束。想想扬声器上的耳机插孔。每个耳机需要实现插孔接口(带启动,停止,监听,转向,转向等方法)。每个耳机都应该覆盖此接口,以继承扬声器提供的功能并相应地实现。

另一方面,抽象类可以包括具有实现的方法。这是基本的区别,在这个意义上它可以利用重用而不是接口。此外,它们可能包含私有,受保护和非静态字段,您无法通过接口。您可以强制子类使用抽象方法(没有实现的方法)实现一些必备功能。抽象类比接口更敏捷。

当然更不用说,您可能只在Java中扩展一个类,您可以在其中实现接口数量。

抽象类与常规类

那么为什么不使用常规课呢?使用抽象类有什么好处?这很简单。如果使用抽象类,则强制核心功能由兄弟姐妹实现。作为开发人员,您无需记住应该实现基本功能。这是抽象类对常规类强加设计约束的地方。另外,通过使类抽象化,您可以避免意外创建(不完整)类。


1
投票

在我看来,抽象类在实际项目中更多地用于书籍。有时项目经理只提供方法声明,你必须编写方法的代码而不修改管理器提供的核心语法。这就是抽象类的使用方式。在简单类方法中同时定义,声明和编码,但不在抽象类中。对于前: -

abstract class Test
{
    abstract void show();//method provided
}
class Child extends Test
{
    void show()//coding 
    {
        System.out.println("saurav");
    }
}
class main
{
    public static void main(String[] args) 
    {
    Test c = new Child();
    c.show();   
    }
}

0
投票

抽象类与常规类与接口。抽象类通常支持泛化的概念,并通过设计多年项目来保持程序员保持一个很小的脑干,因为它们在包含抽象方法时必须描述在subling类中抽象方法的实现,但是,这个当开发人员具有zeitnot时,短期项目的功能是一个缺点。


0
投票

将类声明为抽象的唯一原因是它无法实例化。在某些情况下,您将拥有在多个类之间共享的通用功能,但本身通用功能不代表对象或代表不完整的对象。在这种情况下,您将公共功能定义为抽象,以便无法实例化它。


-1
投票

这可能对你有所帮助,让我们考虑可以使用任何类型车辆的旅行者,如汽车,自行车,自行车等...... 但是所有车辆都以不同的速度限制以相同的方式移动,因此我们可以拥有一个

abstract class Avehicle    
{  
        string fuel;  
        public void move()  
{  
 sysout("moving");  
}   
} 

但所有车辆制动系统都不同

interface Ivehicle    
{  

        public void breakorstop();  
}  
class Traveler    
{  
  Ivehicle v; 
//Settrers and getters   
 public drive()  
{  
v.move();  
}  
public break()  
{  
v.breakorstop();  
}  
}

所以最后Car或Cycle或Bike类可以扩展Avehicle并且可以实现Vehicle接口


-2
投票

抽象类可用于在基于OOP的“库”中存储方法;因为类不需要实例化,并且对它没有多大意义,所以将常见的静态方法保留在抽象类中是一种常见的做法。

© www.soinside.com 2019 - 2024. All rights reserved.