在这里使用什么,抽象类或接口?

时间:2012-08-07 05:24:52

标签: c# java oop class interface

我有一个抽象类说 CTest ,它只包含抽象方法f1()而没有其他内容。同样地,我有一个接口 ITest ,只有方法f1()。这里CTest抽象类和ITest接口都做同样的事情。

一个区别是,接口提供了灵活性,它可以在任何已经从其他类派生的类中实现,但抽象类不能。

除了上述差异外,这两者之间的实际差异是什么?哪一个在这里有效(CTest或ITest)?什么时候应该用什么? OO设计中的任何特定场景以及对此的任何一般性建议都是有帮助的

8 个答案:

答案 0 :(得分:2)

除了继承之外,它取决于场景。请使用一个很好的示例检查this code project article

[来自文章]

  

让我们假设您需要制作三个类,第一个是CAR,第二个是   男,第三是女人。现在你需要在每个中定义一个函数来定义   他们如何移动。现在这三个人都可以移动,但CAR完全进入   与MAN和WOMAN不同的方式。所以这里我们使用一个接口   IMOVEMENT并声明一个函数MOVE in it。现在所有三个班都可以   继承这个界面。所以课程就是这样。

public interface IMovement
{
    void Move();
}

public class Car : IMovement
{
    public void Move()
    {
        //Provide Implementation
    }
}

public class Man : IMovement
{
    public void Move()
    {
        //Provide Implementation
    }
}

public class Woman : IMovement
{
    public void Move()
    {
        //Provide Implementation
    }
}
  

但是,既然MAN和WOMAN以类似的方式行走,那么提供相同的   两种不同方法中的行为将是代码冗余,更简单   单词代码不会被重复使用。所以我们现在可以为它定义一个抽象类   人类的运动,所以这个班可以是人类的动力。也   同样可以应用于CAR类,因为有很多   汽车制造商和所有汽车都以类似的方式运动,所以我们也可以   为汽车运动定义一个抽象类,可以是CARSMOVEMENT。   所以我们重构的代码将是。

public interface IMovement
{
    void Move();
}

public abstract class CarsMovement : IMovement
{

    public virtual void Move()
    {
        //default behavior for cars movement
    }
}

public class SuzukiCar : CarsMovement
{
    public override void Move()
    {
        //Provide Implementation
    }
}

public abstract class HumanBeingMovement : IMovement
{

    public virtual void Move()
    {
        //default behavior for human being movement
    }
}

public class Man : HumanBeingMovement
{
    public override void Move()
    {
        //Provide Implementation
    }
}

public class Woman : HumanBeingMovement
{
    public override void Move()
    {
        //Provide Implementation
    }
}

答案 1 :(得分:1)

Java更喜欢InterfacesAbstract Classes。请参阅 Effective Java

中的第18项

enter image description here

要点

  • 可以撤销现有类以实现新接口。

  • 接口非常适合定义mixins。

  • 接口允许构建非层次化框架。

  • 接口可实现安全,强大的功能增强。

答案 2 :(得分:0)

答案 3 :(得分:0)

对我来说,最好在这里使用界面。当你可以在那里提取一些代码时,你应该使用抽象类(你可以实现方法,或者有其他想要调用它的东西)。

答案 4 :(得分:0)

在这种情况下,并假设您的抽象类只包含抽象方法,在我看来,您应该使用接口。具有抽象方法和接口的抽象类具有相同的用途,但是,您只能扩展一个类,但可以根据需要实现任意多个类,从而如果您决定从其他类继承某些功能,则使您的代码不易发生重大更改。 / p>

关于你的问题:但这两者之间的实际区别是什么?哪一个在这里有效(CTest或ITest)?什么时候应该用什么? OO设计中的任何特定场景以及对此的任何一般性建议都是有帮助的

接口类似于契约,当类实现接口时,它保证了实现。当有人想要提供功能但又不想透露内部代码时,这通常很有用,因此开发人员只会丢弃接口,以便您可以在不知道每种方法如何实现的情况下进行调用。显然,您可以根据需要实现任意数量的接口。

抽象类允许您创建一个具有某些特定行为的类,以及将来要实现的其他一些行。然而,与接口不同,每个类只能扩展一个类,因此从这个角度来看,应该谨慎扩展类。抽象类还允许您将行为注入到一个类中,并让它自动通过其子类传播。这个通常使开发/维护的某些部分更容易。

答案 5 :(得分:0)

在这种情况下没有区别,但CTest类有唯一可以作为Class继承的类。但是,ITest接口可以同时由其他类和接口继承。

答案 6 :(得分:0)

在您提到的场景中,只有一种方法没有定义,最好的方法是接口。

接口在Java中提供的主要优点是可以实现多个接口,但是只能扩展一个类。因此,如果您已经扩展了一个抽象类,那么您不会选择扩展任何其他类。

  

黄金法则:如果我们只需要,接口优于抽象类   定义方法而不是声明它们。

在你的情况下说接口更好,程序员也应该从未来的角度思考他的代码。您是否认为您正在创建的类/接口将来会有更多方法。您想定义这些方法还是只是声明?回答这些问题会告诉您接口是否足够或需要抽象类。

答案 7 :(得分:0)

<强>优势:

Abstract类的实现优于Interface,因为查找抽象类的方法比接口快。如果修改了接口,则必须更新实现类,但是必须修改抽象类,不会影响实现类。

<强>缺点:

If you want to implement more than one parent class method , it is not possible.
But regarding to interface you can implement more than one.