what was a simple example to show who was driving has turned into a complete
design session.  This is very good and taking it one step beyond just a
simple example to a more complete OOD is what these sessions are all about,
thanks for taking the time some of us don't have.

doug...

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: Sunday, May 26, 2002 10:00 PM
To: JDJList
Subject: [jdjlist] RE: Same Method, Multiple Interfaces


> Better still to stay with OOP : source is attached
> (...)

I do not think this is a good approach.
I would recommend the following instead:

1. "Vehicle" should be a base class (perhaps with the method
setSpeed(...) (and similar methods common to all "Vehicle"s) declared
'abstract')
and not an interface, because there most likely will be some attributes
common
to all Vehicle-classes (e.g. maximum speed, current speed etc.)

2. LandTransport and WaterTransport are clearly less specialized than cars
and boats
(e.g. trains are also LandTransports...) and therefore can not be derived
from the more
special classes Car and Boat.
therefore, it is better to declare LandTransport and WaterTransport (and
consequentially
AirTransport) as interfaces (some perhaps empty, so-called "marker
interfaces") to enforce these types
for classes derived from "Vehicle".
Moreover, with your concept you can not define classes that describe
vehicles that are e.g. of type LandTransport AND WaterTransport
(hoovercrafts or amphibian
cars and the like) because you would have to extend both the "Car" and
"Boat"
classes, which is impossible in JAVA (single inheritance is one of the
reasons why interfaces
are a part of JAVA)
on the other hand such classes may implement more than one "...Transport"
(marker-)interface.

public abstract class Vehicle
{
// add here attributes common to all vehicles, e.g.
float speed;
....
// add here methods common to all vehicles in functionality, e.g.
public void setSpeed(float speed)
    {
    this.speed = speed;
    }

// add here methods common to all vehicles that
// can only be implemented in the derived classes, e.g.
// this method has to be implemented individually for each
// derived class, because it is different to put fuel into
// a car or into a nuclear powered submarine....
// we would have to create a Fuel-class as well which
// works as base class for all types of fuel...

public abstract void putFuel(Fuel f);

// REMARK: if you expect to derive classes that describe
// vehicles without any kind of fuel-driven motor (sailing boats,
// rowing boats, bicycles, ....) create an interface
// MotorDriven which enforces the method:
// public interface MotorDriven
//     {
//     public abstract void putFuel(Fuel f);
//     }
// only some classes will implement this interface. the idea is
// the same as for AirTransport (see example below)
// this concept can be used for all kinds of properties that
// would require multiple inheritance otherwise, e.g.
//
// class Car extends Vehicle implements
LandTransport,IndividualTransport,MotorDriven
//
// class JumboJet extends Vehicle implements
AirTransport,MassTransport,MotorDriven
//
// class Clipper extends Vehicle implements
WaterTransport,MassTransport,WindDriven
// (btw, a clipper is a big sailing ship ;-)
}

public interface LandTransport { }     // "marker interface"
public interface WaterTransport { }    // "marker interface"
public interface AirTransport
   {
   // add here methods common to all air vehicles that are
   // enforced inside the derived classes, e.g.
   public void setMaxFlightHeight(float height);
   }

public class Car extends Vehicle implements LandTransport
   {
   public putFuel(Fuel f)
       {
       // put gasoline inside....
       }
   }

// for objects of type "AirTransport" one can be sure of the existance
// of the setMaxFlightHeight() method (because it is enforced by the
interface)

public class Airplane extends Vehicle implements AirTransport
   {
   float maxHeight;
   public void setMaxFlightHeight(float maxHeight)
        {
        this.maxHeight = maxHeight;
        }
   public putFuel(Fuel f)
        {
        // put kerosine inside...
        }
   }

public class Hoovercraft extends Vehicle implements LandTransport,
WaterTransport
   {
   public putFuel(Fuel f)
       {
       // put inside whatever hoovercrafts are powered with ;-)
       }
   }

all objects can be treated as type "Vehicle" (and stored in an array for
instance)
and can be tested for Land-,Water-,AirTransport type
e.g.

Vehicle v = new Airplane();

if (v instanceof AirTransport)
    v.setMaxFlightHeight(10000);    // method sure to be there and
implemented

v.putFuel(new Fuel(...));    // method sure to be there and implemented
...
Vehicle h = new Hoovercraft();

if (h instanceof LandTransport) ....   // true!
if (h instanceof WaterTransport) ..... // true!
...
Vehicle x = new Vehicle();   // ERROR, abstract class, not fully
implemented, cannot be instantiated



> Better still to stay with OOP : source is attached
> public interface Vehicle
> {
>   public void setSpeed(int speed);
> }
>
> abstract public class Car implements Vehicle
> {
>  public Boat(){}
> }
>
> abstract public class Boat implements Vehicle
> {
>  public Boat(){}
> }
>
> public class LandTransport extends Car
> {
>       String speed = "60";
>       public LandTransport(){}
>       public void setSpeed(int speed) {
>         try {
>               this.speed = Integer.toString(speed);
>         } catch(NumberFormatException e) {}
>       }
>       public String toString() {
>         return "The car is going "+speed+"/mph";
>       }
> }
>
> public class WaterTransport extends Boat
> {
>       String speed = "30";
>       public WaterTransport(){};
>       public void setSpeed(int speed) {
>         try {
>               this.speed = Integer.toString(speed);
>         } catch(NumberFormatException e) {}
>       }
>       public String toString() {
>         return "The boat is going "+speed+"/knots";
>       }
> }
>
> import java.util.ArrayList;
>
> public class Transports {
>       LandTransport car = new LandTransport();
>       WaterTransport boat = new WaterTransport();
>       ArrayList trans = new ArrayList(2);
>       public Transports() {
>               car.setSpeed(60);
>               boat.setSpeed(30);
>               trans.add(car);
>               trans.add(boat);
>       }
>       public void drive() {
>               for(int i=0; i<trans.size(); i++) {
>                 Vechicle vh = (Vechicle)array.get(i);
>                 System.out.println(vh.toString());
>               }
>       }
>       public static void main(String [] args) {
>               Transports tr = new Transports();
>               tr.drive();
>       }
> }
>
> -----Original Message-----
> From: Madhav Vodnala [mailto:[EMAIL PROTECTED]]
> Sent: Saturday, May 25, 2002 1:11 AM
> To: JDJList
> Subject: [jdjlist] RE: Same Method, Multiple Interfaces
>
>
> Its the intent of the author. He just expects the boat/car to have a
> 'driving facility'. If he really wanted to have totally different
> 'drive()'.
> then probably he would have enforced 'driveBoat()' in Boat and driveCar()
> in
> Car class.
>
> ----- Original Message -----
> From: "Jason Kilgrow" <[EMAIL PROTECTED]>
> To: "JDJList" <[EMAIL PROTECTED]>
> Sent: Saturday, May 25, 2002 2:08 AM
> Subject: [jdjlist] RE: Same Method, Multiple Interfaces
>
>
> > Very true. And I expect that if I were to use instanceof on an object of
> type Amphibious, it would test true for both Car and Boat types. However,
> was that the intent of the author of Car and Boat? Does it matter?
> > Clearly, from the name of the interface, the drive() method of Car was
> meant to be something totally different than that of Boat. Syntactically,
> Amphibious satisfies the requirements of both Car and Boat. But does it
> satisfy the logical requirements?
> >
> > "Fourt, Martha" <[EMAIL PROTECTED]> wrote:
> >
> > >Your drive() method in Amphibious implements the drive() method in both
> Car
> > >and Boat. You could cast an Amphibous object to an object reference of
> type
> > >Car, or to one of type Boat. In either case, you could call its drive()
> > >method.
> > >
> > > Car aCar = (Car) (new Amphibious());
> > > Boat aBoat = (Boat) (new Amphibious());
> > > aCar.drive();
> > > aBoat.drive();
> > >
> > >
> > >
> > >-----Original Message-----
> > >From: Jason Kilgrow [mailto:[EMAIL PROTECTED]]
> > >Sent: Friday, May 24, 2002 3:07 PM
> > >To: JDJList
> > >Subject: [jdjlist] Same Method, Multiple Interfaces
> > >
> > >
> > >Group,
> > >Consider the following:
> > >
> > >public interface Car
> > >{
> > > public void drive();
> > >}
> > >
> > >public interface Boat
> > >{
> > > public void drive();
> > >}
> > >
> > >public class Amphibious
> > > implements Car, Boat
> > >{
> > > public void drive()
> > > {
> > > System.out.println("I'm driving my amphibious");
> > > }
> > >}
> > >
> > >
> > >Which interface's method have I implemented? Does it matter?
> > >
> > >
> > >__________________________________________________________________
> > >Your favorite stores, helpful shopping tools and great gift ideas.
> > >Experience the convenience of buying online with Shop@Netscape!
> > >http://shopnow.netscape.com/
> > >
> > >Get your own FREE, personal Netscape Mail account today at
> > >http://webmail.netscape.com/
> > >
> > >
> > >To change your membership options, refer to:
> > >http://www.sys-con.com/java/list.cfm
> > >
> > >To change your membership options, refer to:
> > >http://www.sys-con.com/java/list.cfm
> > >
> >
> >
> > __________________________________________________________________
> > Your favorite stores, helpful shopping tools and great gift ideas.
> Experience the convenience of buying online with Shop@Netscape!
> http://shopnow.netscape.com/
> >
> > Get your own FREE, personal Netscape Mail account today at
> http://webmail.netscape.com/
> >
> >
> > To change your membership options, refer to:
> > http://www.sys-con.com/java/list.cfm
>
>
> To change your membership options, refer to:
> http://www.sys-con.com/java/list.cfm
>

--
GMX - Die Kommunikationsplattform im Internet.
http://www.gmx.net


To change your membership options, refer to:
http://www.sys-con.com/java/list.cfm


To change your membership options, refer to:
http://www.sys-con.com/java/list.cfm

Reply via email to