On Tuesday, 5 December 2017 at 08:08:55 UTC, Daniel Kozak wrote:
You can do something like this:

interface Medoid(T) {
    float distance( T other );
    uint id() const @property;
}

class Item : Medoid!(Item) {
    float distance( Item m ) { return 0.;}
    uint id() const @property { return 1; }
}

class MedoidClassification {
    this(T:Medoid!T)(T[] list) {}
    //Medoid[][] getClusters() {...}
}

void main() {
    auto items = new Item[10];
    auto mc = new MedoidClassification( items );
}

On Tue, Dec 5, 2017 at 8:47 AM, Dirk via Digitalmars-d-learn < digitalmars-d-learn@puremagic.com> wrote:

The distance function is implementation dependend and can only be computed between two objects of the same class (in this example the class is Item).

My goal is to write a module for a k-medoids clustering algorithm. The class MedoidClassification shall be able to partition a list of objects from the same class, which implement the Medoid interface.

My current approach is this (which does not work):

interface Medoid {
    float distance( Medoid other );
    uint id() const @property;
}

class Item : Medoid {
    float distance( Item m ) {...}
    uint id() const @property {...}
}

class MedoidClassification {
    this( Medoid[] list ) {...}
    Medoid[][] getClusters() {...}
}

void main() {
    Item[10] items;
    auto mc = MedoidClassification( items );
}


What would be a good way to implement this?

This still defeats the purpose of having multiple Medoid types, as each Medoid is still specified with a specific type.

Reply via email to