代码之家  ›  专栏  ›  技术社区  ›  user366312

C/爪哇中抽象类使用的技术原因

  •  0
  • user366312  · 技术社区  · 16 年前

    根据OOP,抽象类需要对那些在现实世界中不存在但作为几个现实世界对象的基类的对象进行建模。

    例如:

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

    在这里,银行帐户应该建模为抽象类。

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

    例如:

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

    在C.A/JAVA中使用接口的技术原因是为了解决多重继承问题(如果我没有错的话!).

    5 回复  |  直到 6 年前
        1
  •  8
  •   duffymo    16 年前

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

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

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

    因此,您的抽象银行帐户可以具有余额属性,允许储蓄和支票访问。

        2
  •  0
  •   theringostarrs    16 年前

    我不确定我是否理解您的问题,但是抽象类不能被实例化,因此它只能用于此目的。

        3
  •  0
  •   JBrooks    16 年前

    我将给出一个真实的例子。我有一个抽象类,叫做CSourceControl。然后,我有一个名为csvn的VisualSourceSafe调用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
  •   S.Lott    16 年前

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

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

    缺少主体时,该方法是抽象的。这使得类成为一个抽象的整体。


    为什么?

    因为您不想指定“什么都不做”的方法体。您希望完全省略方法体,让占位符由子类填充。

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

    我们提供一个抽象的超类,因为我们需要子类来提供缺失的特性。

        5
  •  0
  •   Rashid    6 年前

    抽象类是面向外部利益相关者的。一个程序是由经理设定的,因为利益相关者很容易看到抽象的程序,即公司将于上午9点开放。但是要为软件开发人员实施一个额外的规则,即他们可能上午10点来。因此,由管理者和下面的人设置的规则是通过抽象的和容易看到的来实现的。下午6点离开公司。你可以看到抽象的方法,也可以了解公司的文化。