假设我具有以下界面:
interface IShape
{
bool Intersect(IShape shape);
}
然后我想要以下具体实现:
class Circle : IShape
{
bool Intersect(Circle shape) {...}
}
class Rectangle : IShape
{
bool Intersect(Rectangle shape) {...}
}
在C#中有没有使用泛型的聪明方法? 即不是这样的任何方式:
interface IShape<T> where T : IShape<T>
{
bool Intersect(T shape);
}
class Circle : IShape<Circle>
{
bool Intersect(Circle shape) {...}
}
答案 0 :(得分:1)
为了说明我的评论:
interface IShape
{
bool Intersect(IShape shape);
}
class Circle : IShape
{
public bool Intersect(IShape shape)
{
switch (shape)
{
case Circle circle:
// Circle / circle intersection
break;
case Rectangle rectangle:
// Circle / rectangle intersection
break;
....
default:
throw new NotImplementedException();
}
}
}
或者使用完全不同的类来处理交叉点,如Eric Lippert's article
答案 1 :(得分:0)
您可以使用像这样的显式接口实现:
interface IShape
{
bool Intersect(IShape shape);
}
class Circle : IShape
{
bool IShape.Intersect(IShape shape) { return Intersect((Circle)shape); }
public bool Intersect(Circle shape) { ... }
}
但是,这会使您的代码非常不安全,因为您可以编写类似这样的内容并仍然通过编译:
IShape s = new Circle();
s.Intersect(new Rectangle());
以上内容将在运行时引发异常。
请谨慎使用。