Допустим, у меня есть абстрактный класс 2 интерфейса:Дайте компиляции ошибки времени, если два класса не реализует тот же интерфейс
public abstract class Entity
{
public abstract void Interact(Entity entity);
}
public interface IFoo
{
void DoFoo();
}
public interface IBar
{
void DoBar();
}
И сейчас, скажем, у меня есть два класса, которые реализуют эти интерфейсы:
public class Foo : Entity, IFoo
{
public override void Interact(Entity entity)
{
// do something with entity...
}
public void DoFoo()
{
// Do foo stuff here..
}
}
public class Bar : Entity, IBar
{
public override void Interact(Entity entity)
{
// do something with obj..
}
public void DoBar()
{
// Do bar stuff here..
}
}
Теперь вопрос, поскольку эти классы реализуют тот же абстрактный класс (Entity
), можно для Bar
взаимодействовать с Foo
или наоборот, что-то вроде этого:
var foo = new Foo();
var bar = new Bar();
foo.Interact(bar); // OK!
bar.Interact(foo); // OK too!
Но теперь, я хочу Foo
только в состоянии взаимодействовать с другим экземпляром IFoo
и дать компиляции ошибки времени, если он пытается взаимодействовать с экземпляром Bar
, то же правило должно применяться к Bar
тоже. Поэтому это должно быть что-то вроде.
var foo = new Foo();
var anotherFoo = new Foo();
var bar = new Bar();
foo.Interact(anotherFoo); // OK!
foo.Interact(bar); // give compile time error
bar.Interact(foo); // this one should give compile time error too
Можно ли это сделать? Если да, то как я могу это сделать?
Просто заметка на полях: Декларация метода 'Interact()' внутри класса 'Entity'. Это должна быть «публичная абстракция». –
Вы можете проверить тип внутри метода 'Interact()' метод и бросить 'ArgumentException', если тип не тот, который вы ожидаете. – Alex
@FlatEric спасибо за исправление! Я обновил вопрос – SirusDoma