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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/151.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
Oop 抽象类与设计点的接口有何不同?_Oop - Fatal编程技术网

Oop 抽象类与设计点的接口有何不同?

Oop 抽象类与设计点的接口有何不同?,oop,Oop,我在stackoverflow上看到了很多答案,但我没有找到与我的答案相匹配的答案。 除了所有这些区别,如果我们说抽象类抽象行为的实现,而接口抽象实现行为的类型,这有意义吗 接口不能提供任何实现。抽象类可以(并且通常确实)提供一些实现 接口不能提供任何实现。不是真的不行,因为抽象类不需要实现任何行为。它可能应该,因为否则你可能会争论它的有用性,但它不是必须的。不是真的不,因为抽象类不需要实现任何行为。它可能应该这样做,因为否则你可能会争辩它的有用性,但它不一定非得如此。从设计角度来看,它的主要区

我在stackoverflow上看到了很多答案,但我没有找到与我的答案相匹配的答案。 除了所有这些区别,如果我们说抽象类抽象行为的实现,而接口抽象实现行为的类型,这有意义吗

接口不能提供任何实现。

抽象类可以(并且通常确实)提供一些实现


接口不能提供任何实现。

不是真的不行,因为抽象类不需要实现任何行为。它可能应该,因为否则你可能会争论它的有用性,但它不是必须的。

不是真的不,因为抽象类不需要实现任何行为。它可能应该这样做,因为否则你可能会争辩它的有用性,但它不一定非得如此。

从设计角度来看,它的主要区别在于:

  • 通过在基本抽象类中创建受保护的构造函数,可以在实现类的构造函数上声明约定
  • 您可以提供基类可用的方法的实现
  • 您可以围绕合同制作包装(例如,验证方法参数)
  • 当您创建调用由派生类实现的类型的抽象方法的非抽象方法时,可以提供“调用方案”。这对于在派生类中实现算法的抽象非常有用,而基类实现所有处理逻辑—准备和验证数据,并让实际的处理算法由派生类实现
因此,我想说您在“抽象类抽象行为的实现,而接口抽象实现行为的类型”这句话中是正确的

抽象类:提供实现某些方法的要求(重写抽象类的方法)

接口:仅定义合同。指示实现该接口的类具有该接口的方法(您实现了一个接口)

例如:

  • 通过在现有类上实现接口,您只需声明将接口方法添加到类的约定中。该类可能已经实现了接口的所有方法,您不需要更改现有类中的任何内容

  • 通过将基类更改为抽象类,您需要重写所有方法,即使该类型上已经存在与基类的抽象方法同名的方法


从设计角度来看,主要区别在于:

  • 通过在基本抽象类中创建受保护的构造函数,可以在实现类的构造函数上声明约定
  • 您可以提供基类可用的方法的实现
  • 您可以围绕合同制作包装(例如,验证方法参数)
  • 当您创建调用由派生类实现的类型的抽象方法的非抽象方法时,可以提供“调用方案”。这对于在派生类中实现算法的抽象非常有用,而基类实现所有处理逻辑—准备和验证数据,并让实际的处理算法由派生类实现
因此,我想说您在“抽象类抽象行为的实现,而接口抽象实现行为的类型”这句话中是正确的

抽象类:提供实现某些方法的要求(重写抽象类的方法)

接口:仅定义合同。指示实现该接口的类具有该接口的方法(您实现了一个接口)

例如:

  • 通过在现有类上实现接口,您只需声明将接口方法添加到类的约定中。该类可能已经实现了接口的所有方法,您不需要更改现有类中的任何内容

  • 通过将基类更改为抽象类,您需要重写所有方法,即使该类型上已经存在与基类的抽象方法同名的方法


通常,抽象类实现某些行为,但未实现某些特定行为

例如,您可以编写一个实现网络应用程序服务器的类,但不实现流程函数,而是将其留给继承的类来实现

class MyServer(Networkserver):
    // process() is called whenever a client has sent a request
    function process(data):
        ...

通过使类抽象,因此无法实例化,专门化函数不必有一些适当的“默认”行为。

通常,抽象类实现一些行为,但保留一些未实现的专门化行为

例如,您可以编写一个实现网络应用程序服务器的类,但不实现流程函数,而是将其留给继承的类来实现

class MyServer(Networkserver):
    // process() is called whenever a client has sent a request
    function process(data):
        ...

通过使类抽象,因此无法实例化,专门化函数不必有一些适当的“默认”行为。

接口=纯抽象类(没有实现的抽象类)

接口=纯抽象类(没有实现的抽象类)

纯粹从设计的角度来看,接口与语言无关,它是类与客户端之间的契约,承诺它做什么,而不是如何做。这是“程序到接口”咒语中暗含的用法

<>因为C++等语言没有接口,抽象类是唯一的表示方法。对于接口为