`
kgdso
  • 浏览: 87956 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

内部类和多重继承(转载)

阅读更多

转载自:http://www.gootry.com/java-base/article/100919202319/330

 

  我们已经看到了许多描述内部类的语法和语义,但是这并不能回答“为什么需要内部类”这个问题。


   那么,Sun公司为什么会如此费心地增加这项基本的语言特性呢?

 

   一般说来,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。

 

   所以可以认为内部类提供了某种进入其外围类的窗口。

 

   内部类必须要回答的一个问题是:如果只是需要一个对接口的引用,为什么不通过外围类实现那个接口呢?

 

   答案是:“如果这能满足需求,那么就应该这样做。”

 

   那么内部类实现一个接口与外围类实现这个接口有什么区别呢?答案是:后者不是总能享用到接口带来的方便,有时需要用到接口的实现。

 

   所以,使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

 

   如果没有内部类提供的、可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。

 

 

   从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。


   也就是说,内部类允许继承多个非接口类型(译注:类或抽象类)。


   为了看到更多的细节,让我们考虑这样一种情形:即必须在一个类中以某种方式实现两个接口。

 

   由于接口的灵活性,您有两种选择:使用单一类,或者使用内部类:


   //: innerclasses/MultiInterfaces.java
   // Two ways that a class can implement multiple interfaces


   package innerclasses;

 

   interface A {}
   interface B {}

   class X implements A, B {}
   class Y implements A {
      B makeB() {
         // Anonymous inner class:
         return new B() {};
      }
   }

 

   public class MultiInterfaces {
      static void takesA(A a) {}
      static void takesB(B b) {}
      public static void main(string[] args) {
         X x = new x();
         Y y = new Y();
         takesA(x);
         takesA(y);
         takesB(x);
         takesB(y.makeB());
      }
   }

 

   当然,这里假设在两种方式下的代码结构都确实有逻辑意义。

 

   然而遇到问题的时候,通常问题本身就能给出某些指引,告诉您是应该使用单一类,还是使用内部类。

 

   但如果没有任何其他限制,从实现的观点来看,前面的例子并没有什么区别,它们都能正常运作。

 

   如果拥有的是抽象的类或具体的类,而不是接口,那就只能使用内部类才能实现多重继承。


   //: innerclasses/MultiImplementation.java
   // With concrete or abstract classes.inner
   // classes are the only way to produce the effect
   // of "multiple implementation inheritance."

 

   package innerclasses;


   class D {}
   abstract class E {}
   class Z extends D {
      E maKeE() {return new E() {};}
   }

   public class MultiImplementation {
      static void takesD(D d) {}
      static void takesE(E e) {}
      public static void main(String[] args) {
         Z z = new Z();
         takesD(z);
         takesE(z.makeE());
      }
   }


   如果不需要解决“多重继承”的问题。那么自然可以用别的方式编码,而不需要使用内部类。

 

   但如果使用内部类,还可以获得其他一些特性:

 

   一、内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。

 

   二、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。

 

   三、创建内部类对象的时刻并不依赖于外围类对象的创建。

 

   四、内部类并没有令人迷惑的“is-a”关系;它就是一个独立的实体。

 

   举个例子,如果Sequence.java不使用内部类,就必须声明“Sequence是一个Selector”,对于某个特定的Sequence只能有一个Selector。


   然而使用内部类很容易就能拥有另一个方法reverseSelector(),用它来生成一个反方向遍历序列的Selector。只有内部类才有这种灵活性。

分享到:
评论

相关推荐

    分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求:①在两个基类中都包含

    分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求:①在两个基类中都包含一部分相同名字的数据成员name(姓名),age(年龄)和成员函数...

    实现C++类的多重继承

    在C++编程语言中,多重继承是一种特性,允许一个派生类从多个基类继承属性和行为。这种机制使得代码重用更为灵活,能够构建更复杂的类层次结构。本篇文章将详细探讨C++中的多重继承及其相关的实现细节。 首先,我们...

    实现c++类的多重继承的例程

    在C++编程语言中,多重继承是一种特性,允许一个派生类从多个基类中继承属性和行为。这种设计模式增强了代码的复用性,并且能够构建复杂的类层次结构。以下是一个关于如何实现C++类的多重继承的详细解释。 首先,让...

    C++编程思想--多重继承

    多重继承是C++中的一种特性,允许一个类可以从多个基类中继承属性和行为,从而实现代码复用和设计灵活性。这种机制使得类能够结合多个基类的功能,但同时也引入了一些复杂性和潜在的问题。 1. **子对象重叠** 当一...

    面向对象之二 继承(多重继承)

    2. **混合类型**:多重继承可以用来创建具有多种特质的对象,例如一个同时具有图形处理能力和文件操作能力的类。 3. **代码组织**:在大型项目中,不同的功能可能分散在多个类中。通过多重继承,我们可以将相关功能...

    多重继承 面向对象 实验报告

    在此基础上,为了进一步体现多重继承的特性,设计了一个名为`Graduate_Student`的类,它是`Student`和`Teacher`的共同派生类。这意味着`Graduate_Student`同时继承了`Student`和`Teacher`的属性和行为,因此它可以...

    C++习题 多重继承

    这种方式可以让派生类继承多个基类的特性,从而实现代码的复用。 ### 示例中的多重继承结构 在给定的示例中,`Teacher_Cadre` 类是 `Teacher` 和 `Cadre` 两个类的派生类。这意味着 `Teacher_Cadre` 可以同时具有...

    VC 实现C 类的多重继承.rar

    VC 实现C 类的多重继承,cout(1,1,2008,11,12,12);//直接使用DateTimeType构造函数设置日期时间  cout();//显示时间日期  dt.SetDate(8,8,2008);//调用基类的成员函数修改日期  dt.SetTime(20,8,8);//调用基类...

    实例001——实现C++类的多重继承.zip

    在C++编程语言中,多重继承是一个重要的特性,它允许一个子类(派生类)继承多个父类(基类)的属性和方法。这个特性使得代码复用更加灵活,可以设计出更复杂的类层次结构。本实例"实例001——实现C++类的多重继承...

    多重继承(6_7钻石继承问题)_C++_

    在C++编程语言中,多重继承是一个特性,允许一个类(子类)继承自多个基类(父类)。这种设计模式使得子类可以同时获得多个基类的特性,增加了代码的复用性。然而,多重继承也带来了一些复杂性和潜在的问题,其中最...

    Python语言基础:类的多重继承.pptx

    例如,`Dog`类继承自`Mammal`和`Runnable`,所以它可以跑;而`Bat`类继承自`Mammal`和`Flyable`,所以它可以飞。 在实际操作中,我们可以创建`Bat`对象,并调用它的方法来查看其行为。例如: ```python d = Bat() d...

    VC8.0上多重继承的内存布局

    考虑到示例代码中的 `CTest` 类,我们可以看到它是从 `IA` 和 `IB` 多重继承而来的。在 `CTest` 类的构造函数中初始化了私有成员 `n_`,并且实现了 `IA` 和 `IB` 类的所有纯虚函数。在 `main` 函数中创建了一个 `...

    类多重继承的模糊性的消除

    类多重继承的模糊性的消除,类多重继承的模糊性的消除

    java内部类总结(含概念和实例)

    接口解决了部分问题,而内部类有效地实现了“多重继承”。 成员内部类的特点: * 成员内部类不能定义静态成员 * 成员内部类可以访问外部类的所有成员 * 成员内部类可以访问外部类的私有成员 局部内部类的特点: ...

    C++内部类详细分析

    在这种情况下,派生类继承了两个共同的基类,这两个基类又分别继承了另一个基类。如果没有使用虚继承,这会导致基类的成员被多次继承,从而引发问题。 为了高效地使用多重继承,开发者需要遵循以下几点建议: - **...

    多重继承和虚继承.doc

    多重继承和虚继承是C++中两种高级的继承方式,它们允许类从多个基类中获取属性和行为,但同时也引入了一些复杂性和潜在的问题。 **多重继承** 是指一个类可以从多个基类派生,从而获得多个基类的特性。在多重继承中...

    第4章继承和多重继承.ppt

    继承是面向对象编程(OOP)中的一种机制,允许一个类继承另一个类的所有成员变量和成员函数。继承可以实现代码的重用和扩展,提高编程效率和代码的可维护性。 一、继承的概念 继承是从已定义的类中导出新类时,新...

    *抽象类、多重继承、接口

    *抽象类、多重继承、接口:设计一抽象类Emploee(职工),包括属性: 姓名、年龄、职业名称和基本功能:工作(work()),休息(sleep(); 派生两个子类Teacher(教师)和Softer(软件公司员工); 设计两个接口Manage(管理...

Global site tag (gtag.js) - Google Analytics