0

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

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

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

4

8 回答 8

2

除了继承,它取决于场景。用一个很好的例子检查这个代码项目文章。

[来自文章]

假设您需要创建三个类,第一个是 CAR,第二个是 MAN,第三个是 WOMAN。现在你需要在它们中的每一个中定义一个函数来定义它们如何移动。现在这三个都可以移动,但 CAR 的移动方式与 MAN 和 WOMAN 完全不同。所以这里我们使用一个接口 IMOVEMENT 并在其中声明一个函数 MOVE。现在所有三个类都可以继承这个接口。所以上课是这样的。

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 的行走方式相似,因此以两种不同的方法提供相同的行为将是代码冗余,简单来说,代码不会被重用。所以我们现在可以为人类运动定义一个抽象类,所以这个类可以是 HUMANBEINGMOVEMENT。同样可以应用于 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
    }
}
于 2012-08-07T05:31:38.600 回答
1

在更Java喜欢. 参考Effective Java中的第 18 条InterfacesAbstract Classes

在此处输入图像描述

要点

  • 可以对现有类进行改造以实现新接口。

  • 接口是定义 mixin 的理想选择。

  • 接口允许构建非分层类型框架。

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

于 2012-08-07T05:30:06.543 回答
0

在这种情况下,假设您的抽象类将只包含抽象方法,在我看来,您应该使用接口。具有抽象方法和接口的抽象类具有相同的目的,但是,您可以只扩展一个类,但可以实现任意数量的类,因此如果您决定从其他类继承某些功能,则可以使您的代码不易发生重大变化。

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

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

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

于 2012-08-07T05:30:04.310 回答
0

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

于 2012-08-07T05:31:48.873 回答
0

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

接口在 Java 中的主要优势在于您可以实现多个接口,但您只能扩展一个类。因此,如果您已经在扩展一个抽象类,那么您将无法选择扩展任何其他类。

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

已经说过在您的情况下接口更好,程序员还应该从未来的角度考虑他的代码。你觉得你正在创建的类/接口将来会有更多的方法吗?您想定义这些方法还是只声明?回答这些问题会让您知道接口是否足够或需要抽象类。

于 2012-08-07T05:32:09.990 回答
0

在 c# 中它只允许单级继承。因此接口可以用来做多重继承

还有更多详细信息:

http://www.dotnetfunda.com/forums/thread4085-difference-between-interface-and-abstract-class.aspx

http://sadi02.wordpress.com/2008/05/08/what-is-difference-in-an-abstract-class-and-an-interface/

于 2012-08-07T05:28:26.970 回答
0

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

于 2012-08-07T05:28:31.990 回答
0

优势:

抽象类的实现优于接口,因为抽象类的方法查找比接口快。如果你修改你的接口,你必须更新你的实现类,但是抽象类的任何修改,对实现类没有影响。

坏处:

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.
于 2012-08-07T05:36:35.297 回答