如果两个 类 没有实现相同的接口,则给出编译时错误
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..
}
}
比方说,我有一个抽象 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..
}
}