2

我读了很多关于“接口”和“抽象类”的帖子

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

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

但这仍然令人困惑,所以我自己做一个例子来练习。

所以现在我在想一个对象'货物;

    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. 如果我们设置“private id”,那么我们实际上不能在任何子类中使用“id”这个变量,因为它是私有的,这是否意味着我们在抽象类中定义的每个变量都必须是公共/受保护的?

  2. 有人可以举一些合适的例子让我的货物可以实现一些接口吗?

    public interface registration{
         public void lastWarrantyCheck();
    }
    

    不过好像不太适合这里...

  3. 我们通常不在接口内定义变量,对吗?

我试图在 OOP 上获得更多意义。原谅我长长的问题。

4

3 回答 3

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

  2. 您可以在此处找到一些有关如何实现接口的示例。但是,我在下面包含了您将如何实现注册示例。

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

于 2013-02-23T04:26:47.700 回答
1

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

private当您想强制具体类通过抽象类中定义的 getter 或 setter 时应该使用。

protected当您想要让具体类直接访问变量时应该使用。

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

Cargo 对象可能实现的合理接口可以是 Shippable ,就像如何将货物从源移动到目的地一样。有些货物可以通过货运列车运输,有些可以通过飞机运输,等等。实现 Shippable 并定义如何运输这种类型的货物取决于具体的类。

public interface Shippable {
    public void ship();
}

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

希望这可以为您解决问题!

于 2013-02-23T04:35:12.483 回答
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. 实际上,只有常量作为接口中声明的变量是不可变的,并且由实现该接口的所有对象共享。它们是隐含的“静态最终”。

于 2013-02-23T04:40:40.327 回答