使用抽象类有什么意义?

时间:2013-12-28 12:01:38

标签: c# oop interface abstract

我知道这是一个noob问题,但我必须要问它:使用抽象类的目的是什么?

假设我想从10个不同的赌博网站中提取数据。所以我用抽象方法创建了一个抽象类,我在每个10个类中覆盖了这些方法(每个网站都有1个 - 因为每个网站都有不同的DOM)。

抽象类中的方法确实没有做任何事情。为什么我不能只为我的10个类中的每一个声明一个具有相同名称的方法?

界面的相同问题。

4 个答案:

答案 0 :(得分:2)

OOP(以及其他编程范例)中称为polymorphism的概念至关重要。在你的例子中,它允许你说出所有这些对象的共同点,虽然实现是特定于每个类的,但它表示它们都应该拥有它,这就是它们的特征。

多态性允许人们对任何共同点进行概括,并且通常可以通过提供更高级别的抽象来避免样板代码。 引自维基百科:

  

在编程语言和类型理论中,多态性(来自希腊语πολύς,polys,“many,much”和μορφή,morphē,“form,shape”)是为不同类型的实体提供单一接口。多态类型是一种类型,其操作也可以应用于某些其他类型或类型的值。有几种根本不同的多态性:

     
      
  • 如果函数表示不同且可能异构的实现,具体取决于单独指定的类型和组合的有限范围,则称为ad hoc多态。使用函数重载,许多语言都支持Ad hoc多态。

  •   
  • 如果编写的代码没有提及任何特定类型,因此可以透明地使用任意数量的新类型,它称为参数多态。在面向对象的编程社区中,这通常被称为泛型或泛型编程。在函数式编程社区中,这通常简称为多态。

  •   
  • 子类型(或包含多态性)是一种概念,其中名称可以表示许多不同类的实例,只要它们与某些公共超类相关即可。在面向对象的编程中,这通常被简称为多态。

  •   

答案 1 :(得分:1)

它提供了您的程序结构。您可以拥有一个名为BaseScraper的抽象基类,然后使用一个名为scrape()的方法为每个要从每个站点获取的站点派生类。然后,您可以将每个scraper的实例添加到数组中,并遍历此数组,在每个实例上调用Scrape()来收集数据。如果您想添加另一个站点,您只需要创建另一个实现Scrape()方法的派生类,并将其添加到您的scraper数组中。您无需更改任何其他代码,新的刮刀将自动合并。

答案 2 :(得分:1)

您的示例不符合抽象类的真正目的。尝试阅读这样的内容:

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

答案 3 :(得分:1)

不同方法有几个原因。请考虑以下事项:

public abstract class MyAbstractBaseClass
{
     String m_url;
     public MyAbstractClass(String url)
     {
         m_url = url;
     }

     public abstract String GetSiteData();
}

public class SiteAGetter : MyAbstractBaseClass
{
     // ...
     public override String GetSiteData()
     {
     // ...
     }
}

使用这种抽象方法,编译器必须在每个重写实现中真正实现GetSiteData()方法。当然,您可以将基类中的GetSiteData实现为

public virtual String GetSiteData()
{
     return null;
}

但是现在你没有需要在派生类中实现该方法,并且你需要在使用之前确保在调用方法的每个地方返回值都为非null它。所以基本上它可以帮助你自己防止任何明显的错误(你不希望任何人写一个没有实现该方法的派生类)。此外,抽象类不能直接实例化,因此没有人会犯错创建基类的实例,因为编译器会阻止它。

接口的用途略有不同:它们可以由不同的,不相关的类实现。因此,如果由于某种原因您无法创建公共库,但您希望多个类公开相同的接口(=提供相同的功能)但它们不相关,请使用接口。接口也用于其他原因,例如在单元测试环境中进行模拟。还有更多,我建议你阅读一些关于它的好书,然后提出更具体的问题。