在C#/ Java中使用抽象类的技术原因

时间:2009-07-27 01:40:32

标签: abstract-class

根据OOP,需要抽象类来模拟那些在现实世界中不存在的对象,但它们可以作为几个真实世界对象的基类。

例如:

   BankAccount            
       /\
      /  \
     /    \
    /      \
Current     Savings
Account     Account

此处BankAccount应建模为抽象类。

但是在C#/ Java中使用抽象类的技术原因是什么? link text

例如:

使用Interfaces的OOP原因是对行为继承进行建模(继承没有真正的层次关系)。

在C#/ Java中使用Interfaces的技术原因是为了解决多重继承问题(如果我没错!)。

5 个答案:

答案 0 :(得分:8)

如果可能有合理的事情,抽象类可以有默认行为;接口不能。

抽象类可以为所有方法或没有方法提供默认行为;开发者的选择;接口不能。

抽象类可以具有与所有子类共享的状态;接口不指定状态。

因此,您的抽象BankAccount可以具有可以授予存储和检查访问权限的余额属性。

答案 1 :(得分:0)

抽象类无法实例化,因为它们缺少方法定义。

你可以在超类中定义一个垃圾 - 什么都不做 - 方法函数。但那太傻了。不要定义“什么都不做”,不要定义任何东西。

缺少身体,方法是抽象的。这使得整个班级成为一个抽象的。


<强>为什么吗

因为您不想指定“不执行任何操作”方法体。你想完全省略方法体,留下一个由子类填充的占位符。

您可以创建超类以包含子类之间的常见行为。在某些情况下,超类不能是一个完整的类,因为每个子类必须提供覆盖或扩展。

我们提供了一个抽象超类,因为我们需要子类来提供缺少的功能。

答案 2 :(得分:0)

我不确定我理解你的问题但是,抽象类无法实例化,所以它只能用于此目的。

答案 3 :(得分:0)

我将举一个现实世界的例子。我有一个抽象类调用cSourceControl。然后我有一个Visual Source Safe调用cVSS的类和一个名为cSVN的Subversion类,它们都是从cSourceControl继承的。

现在抽象类有一堆继承类可以使用的属性和方法(是的,带代码)。抽象类还定义了一组继承类必须实现的抽象方法:

public abstract DataTable getFiles(string path, string filter, DateTime since, bool filterAuthorByLastCheckin, bool expandAll, bool onlySinceBranched);
public abstract DataTable getFiles(string path, string filter, DateTime since, string lastUser, bool filterAuthorByLastCheckin, bool expandAll, bool onlySinceBranched);
public abstract long getFile(string sFileName, string sVersion, string sLocalFileName);
public abstract DataTable getFileVersions(string sFileName);
public abstract DataTable getDirectories(string path, bool expandAll);
public abstract DataTable getChangedFiles(string path);
public abstract DataTable GetFileLogRevision(string path, string revision);
public abstract DateTime getBranchStartDateTime(string sBranch);

从这里你可以看出SourceControl类将需要其中的每一个,但它在cVSS中的外观与它在cSVN中的外观非常不同。另一个回报是在运行时我可以选择VSS或SVN。简化的代码片段可能是:

cSourceControl sc;

if(usingVSS)
   sc = new cVSS();
else
   sc = new cSVN();

DataTable dtFiles = sc.getChangedFiles("myproject/branches/5.1/");
etc.

现在,当我的客户开始要求Git或SourceGear时,我只需创建这些类并进行其他更改。

答案 4 :(得分:0)

抽象类面向外部利益相关者。经理设置了一个程序,因为利益相关者很容易看到摘要,因为公司将于上午9点开放。但是为软件开发人员实施一条额外的规则,即他们可能会在上午10点到来。因此,经理和以下人员设置的规则是抽象实现的,并且很容易看到。 6pm从公司退出。您可以看到抽象的方法,并且可以了解公司的文化。