Programmazione Avanzata

Primo Semestre 2005/2006

 

Esercizio

  1. Utilizzando il generatore Coco/R scrivere un compilatore (in C#, C++ o Java) per un sottoinsieme di IDL che comprende la specifica di interfacce quali la seguente:
      // Pippo.idl
      interface Pippo {
        attribute int X;
        int Foo();
        void Bar(int x, int y, int z);
        float FooBar(double y); 
    };
    
    Una interfaccia contiene signature di metodi o di attributi. Ad un attributo corrisponde la definizione di due metodi per accedere/modificare l'attributo. Ad esempio il codice generato per l'interfaccia precendete dovrà essere simile al seguente:
     // Pippo.cs
     public class Pippo {
        private int _X;
        public int GetX() { return _X; }
            public void SetX(int X) { _X = X; }
            public int Foo() { /*code here*/ }
            public void Bar(int x, int y, int z) { /*code here*/ }
        float FooBar(double y) { /*code here*/ }
    }
    
  2. Modifcare il compilatore del punto precedente affinché produca sia una interfaccia (C#, Java, o una abstract class C++) che una classe che la implementa, e inoltre una classe che implementa IClassFactory e che fornisce un metodo per costruire istanze della classe. Nel caso dell'esempio precedente:
     // IPippo.cs
     public interface IPippo {
        private int _X;
        public virtual int GetX();
            public virtual void SetX(int X);
            public virtual int Foo()
            public virtual void Bar(int x, int y, int z);
        float virtual FooBar(double y);
    }
    
     // Pippo.cs
     public class Pippo : IPippo {
        private int _X;
        public int GetX() { return _X; }
        public void SetX(int X) { _X = X; }
        public int Foo() { /*code here*/ }
        public void Bar(int x, int y, int z) { /*code here*/ }
        float FooBar(double y) { /*code here*/ }
    }
    
     // PippoFactory.cs
     public class PippoFactory : IClassFactory {
         public IPippo CreateInstance() {
              return (IPippo)new Pippo();
         }
         static IClassFactory GetClassObject() {
              return thePippoFactory;
         }
         static PippoFactory thePippoFactory = new PippoFactory();
     }