25-Comp-B11 Advanced Software Design · May 2014
Nivaar worked solution (AI-drafted; not reviewed by a licensed engineer)
Question text not reproduced: the examination questions are © Engineers and Geoscientists BC. Open the official past paper (linked at the top of this page) to read the question, then follow the worked solution below.
Java prohibits multiple inheritance of IMPLEMENTATION (a class extends exactly one superclass) specifically to avoid the diamond problem — ambiguity when two parent classes each supply a conflicting field or method implementation and a common descendant inherits both (C++ solves this with explicit scope resolution and virtual inheritance, at real added complexity, ties to Question 22's broader theme of C++ features traded against simplicity).
Java instead permits multiple inheritance of TYPE: a class may implements any number of interfaces. Historically (pre-Java 8), interfaces could declare only method SIGNATURES, never implementations, so there was no possibility of conflicting inherited implementations at all — only the "is-a-capability" (type) was multiply inherited, never behaviour, which is precisely why Java could allow it safely without a diamond problem.
Since Java 8, interfaces may carry default method implementations, reintroducing a narrow diamond-like case: a class implementing two interfaces that each supply a CONFLICTING default implementation of the same method signature does not compile with either silently chosen — Java forces the implementing class to explicitly override the method (optionally calling InterfaceA.super.method() to select one, or supplying wholly new logic). Java therefore turns the diamond conflict into a mandatory COMPILE-TIME resolution point, rather than resolving it silently or leaving it to be discovered at runtime as unguarded multiple implementation inheritance would.
Practical guidance depends on the characteristics of what is being "inherited." If what's needed is genuinely just a TYPE/capability (a Comparable- or Runnable-style role) with no, or only default, reusable behaviour, implementing multiple interfaces directly is sufficient and idiomatic. If genuine STATE plus substantial behaviour needs to be reused from more than one existing concrete class, Java has no direct expression for "extends A, B" for two classes each carrying instance state — the design is forced into DELEGATION/composition instead (directly, Question 23): hold a private reference to each "would-be parent" and forward the specific operations needed, since only one of them can ever be a genuine superclass.