Partial sound ok to me, but I not so good at naming  ?

Considering the number of classes, I gave it some thoughts this morning
and, like Dmitry, thought of merging the Abtract (Partial) into the
interface before realizing that, even if it works (you can overload de
default function in Empty) it's a bit ugly and I ended up preferring
your solution.

An altenative would be to have a Dataset with both aspects and provide
three partial specialisations: one for vector (it will behave like empty
raster) one for raster, and one for both. Code duplications could be
avoided by implementing protected member functions in the Dataset class
and simply calling them in the implementations of partial
specialization. This solution avoid the diamond shaped inheritance
diagram of hell :)
Actually the diamond shaped inheritance does not work at all (as I somehow
feared ;-)). I must have confused myself with how I would have done things in
Java, but in C++, I can't manage to do it... Here's a self-contained code that
does not compile : https://gist.github.com/rouault/9761494

I think I'm going to try something more plain and stupid. Just "import" methods
from OGRDataSource into GDALDataset, making OGRDataSource extends GDALDataset
and make that compile...

I'm not sure to have understood what you meant with "protected member functions
in the Dataset class and simply calling them in the implementations of partial
specialization". With an example it would be clearer to me.

Sorry, I mixed up things, what I meant was pure virtual with implementation (see below).

(note: I use struct instead of class because it avoid repeating 'public' all the time)

struct IGDALDataset
{
    virtual int         HandleRasterData() = 0;
    virtual int         HandleVectorData() = 0;
};

int IGDALDataset::HandleVectorData()
{
    return true;
}

int IGDALDataset::HandleRasterData()
{
    return true;
}

struct GDALVectorDataset: IGDALDataset
{
    int HandleRasterData(){ return false; }
    int HandleVectorData(){ return IGDALDataset::HandleVectorData(); }
};

struct GDALRasterDataset: IGDALDataset
{
    int HandleRasterData(){ return IGDALDataset::HandleRasterData(); }
    int HandleVectorData(){ return false; }
};


struct GDALDataset: IGDALDataset
{
    int HandleRasterData(){ return IGDALDataset::HandleRasterData(); }
    int HandleVectorData(){ return IGDALDataset::HandleVectorData(); }
};





_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to