在面向对象编程中何时需要抽象?

时间:2013-02-23 03:57:39

标签: oop object interface abstract-class

我阅读了很多关于“界面”和“抽象类”的帖子

基本上,当我们谈论对象的特征时,我们使用“抽象类”。

当我们讨论对象能够做什么时,我们使用“接口”。

但它仍然令人困惑,所以我为自己做了一个练习的例子。

所以现在我想到了一个物品'货物;

    public abstract class cargo {

        protected int id;

        public abstract int getWidth(int width);

        public abstract int setWidth(int width);

        public abstract int setHeight(int h);

        public abstract int getHeight(int h);

        public abstract int setDepth(int d);

        public abstract int getDepth(int d);

        public abstract int volume(int w,int h,int d);

        public int getId(){
            return this.id;
        }

        public abstract int setId();

        public abstract void setBrand();

        public abstract void getBrand( );

        .....so on , still have a lot of characteristic of a cargo
    }

    //in the other class
    public class usaCargo extends cargo{
                  ....
                  private 

    }

所以这里几乎没有关于我的设计的问题。

1.因此,在真正的编程项目世界中,我们实际上是在做什么吗?对我来说,我认为这是好的设计,我们符合货物的基本特征。

  1. 如果我们设置“私有id”,那么我们实际上不能在任何子类中使用“id”这个变量,因为它是私有的,所以这意味着我们在抽象类中定义的每个变量都必须是public / protected

  2. 有人可以提供一些合适的例子,以便我的货物可以实现一些界面吗?

    public interface registration{
         public void lastWarrantyCheck();
    }
    

    但这里似乎不合适......

  3. 我们通常不在界面内定义变量,是吗?

  4. 我试图在OOP上获得更多的感觉。原谅我的长期问题。

3 个答案:

答案 0 :(得分:1)

  1. 抽象类可以包含实现,因此它们可以包含私有变量和方法。另一方面,接口不能。

  2. 您可以找到有关如何实现接口here的一些示例。但是,我在下面介绍了如何实现您的注册示例。

    public class Cargo implements Registration{
       public void lastWarrantyCheck(){
          System.out.println("Last warranty check");
       }           
    }
    
  3. 接口变量是可能的,但它们应该只包括常量声明(声明为静态和最终的变量声明)。有关此内容的更多信息,请访问here

答案 1 :(得分:1)

您可以在Abstract类中定义变量,以便抽象类中定义的方法具有要使用的变量。这些变量的范围取决于您希望具体类如何访问这些变量:

当你想强制一个具体的类通过抽象类中定义的getter或setter时,应该使用

private

当你想让具体类直接访问变量时,应该使用

protected

当您希望任何类都可以访问该变量时,应使用

public

Cargo对象可能实施的合理界面可以是Shippable,如同如何将货物从源移动到目的地。有些货物可以通过货运列车运输,有些货物可以通过飞机等运输。具体的类别可以实施Shippable并确定货物的运输方式。

public interface Shippable {
    public void ship();
}

最后,接口中定义的变量必须是public static,final意味着它是一个常量变量。

希望这能为你解决这个问题!

答案 2 :(得分:1)

  1. 抽象类中的变量可以声明为protected,它们只能在其中和任何扩展类中使用。在扩展类中永远不能访问Private个变量。

  2. 接口提供了实现它们的类所需的函数列表。例如,您可以使用接口hasWarranty来定义对象处理与保修相关的活动所需的所有功能。

    public interface hasWarranty {
        public void lastWarrantyCheck();
        public void checkWarranty();
    }
    

    然后,任何需要执行保修相关活动的对象都应该实现该接口:

    // Disclaimer: been away from Java for a long time, so please interpret as pseudo-code.
    
    // Will compile
    public class Car implements hasWarranty {
        public void lastWarrantyCheck() {
            ... need to have this exact function or program won't compile ...
        }
        public void checkWarranty() {
            ... need to have this exact function or program won't compile ...
        }
    }
    
    // Missing one of the required functions defined in hasWarranty
    public class Bus implements hasWarranty {
        public void lastWarrantyCheck() {
            ... need to have this exact function or program won't compile ...
        }
    }
    
  3. 实际上,只有常量作为接口中声明的变量是不可变的,并且由实现该接口的所有对象共享。它们隐含着“静态最终”。