如果两个 类 没有实现相同的接口,则给出编译时错误

Give compile time error if two classes doesn't implement same interface

比方说,我有一个抽象 class 2 个接口:

public abstract class Entity
{
    public abstract void Interact(Entity entity);
}

public interface IFoo 
{
    void DoFoo();
}

public interface IBar
{
    void DoBar();
}

现在,假设我有两个 class 实现了这些接口:

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..
    }
}

现在的问题是,由于那些 classes 实现了相同的抽象 class (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

有可能做这样的事吗? 如果可以,我该怎么做?

你在这里混淆了一些元素

实体与 IFoo 或 IBar 没有关系
Foo 与 Entity 和 IFoo 有关系 Bat与Entity和IBar有关系

因此,如果您只想与 IFoo 交互,则需要将 IFoo 指定为父实体而不是实体

public class Foo : Entity, IFoo
{
    public void Interact(IFoo entity)
    {
        // do something with entity...
    }

    public void DoFoo()
    {
       // Do foo stuff here..
    }
}

public class Bar : Entity, IBar
{
    public void Interact(IBar entity)
    {
        // do something with obj..
    }

    public void DoBar()
    {
       // Do bar stuff here..
    }
}

由于交互的行为并非由其所有子项共享,因此交互不属于父项

不过你可以用泛型来解决这个问题

public abstract class Entity<T>
 where T:Entity
{
    void Interact(T entity);
}

这将允许您将 foo 声明为

public class Foo : Entity<Foo>, IFoo
{
    public override void Interact(Foo entity)
    {
        // do something with entity...
    }

    public void DoFoo()
    {
       // Do foo stuff here..
    }
}