Closed

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
Labels
No labels