根据OOP,需要抽象类来模拟那些在现实世界中不存在的对象,但它们可以作为几个真实世界对象的基类。
例如:
BankAccount
/\
/ \
/ \
/ \
Current Savings
Account Account
此处BankAccount应建模为抽象类。
但是在C#/ Java中使用抽象类的技术原因是什么? link text
例如:
使用Interfaces的OOP原因是对行为继承进行建模(继承没有真正的层次关系)。
在C#/ Java中使用Interfaces的技术原因是为了解决多重继承问题(如果我没错!)。
答案 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从公司退出。您可以看到抽象的方法,并且可以了解公司的文化。