Skip to content

True Duck typization. #470

Closed
Closed
@ghost

Description

Now we have "duck typization":

interface IDuck {
    void Quack();
}
class DuckTypedDuck : IDuck {
    void Quack() { }
}
class ImplicitlyTypedDuck : IDuck {
    void IDuck.Quack() { }
}
class DuckInTheShadow {
    void Quack() { }
}

There DuckInTheShadow is not an IDuck.


I want for DuckInTheShadow is an IDuck.

For example:

interface IDuck {
    void Quack();
}
class Animal {
    void Bark() { }
}
class DuckInTheShadow : Animal {
    void Quack() { }
}

interface IDartDuck {
    void Quack();
}
class DuckInTheDart : IDartDuck {
    void IDartDuck.Quack() { }
}

class Program {
    void Main () {
        var duckInTheShadow = new DuckInTheShadow();
        IsAnimalAnIDuck(duckInTheShadow); // return false
        IsDuckInTheShadowAnIDuck(duckInTheShadow); // return true

        var duckInTheDart = new DuckInTheDart();
        IsDuckInTheDartAnIDuck(duckInTheDart); // return false
                                               // because class can have multiple implicit
                                               // `void Quack();` method realizations
                                               // from different interfaces
                                               // 
                                               // if class implements `IDuck` or
                                               // inherits `IDuck` implementation
                                               // it is already `IDuck`
        IsIDartDuckAnIDuck(duckInTheDart); // return true
    }
    bool IsAnimalAnIDuck (Animal animal) {
        return animal is IDuck;
    }
    bool IsDuckInTheShadowAnIDuck(DuckInTheShadow duckInTheShadow) {
        return duckInTheShadow is IDuck;
    }
    bool IsDuckInTheDartAnIDuck(DuckInTheDart duckInTheDart) {
        return duckInTheDart is IDuck;
    }
    bool IsIDartDuckAnIDuck(IDartDuck dartDuck) {
        return dartDuck is IDuck;
    }
}

It must work in compile time first.
For runtime duck typing can be used dynamic<IDuck>.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions