如何在隐式可转换类型之间进行接口?

时间:2012-08-13 09:10:22

标签: c# interface implicit-conversion

我有一个简单的System.Drawing.Point(int,int)。

public class Foo
{
    public Point Point;
}

我需要这个类用PointF(float,float)实现一个接口:

public interface IPointable { PointF Point { get; } }

当然,当我尝试Foo : IPointable时,我有

Error   7   'Foo' does not implement interface member 'Pointable.Point'

所以,我用

更改了我的Foo类
public class Foo
{
    public Point IntPoint;
    public PointF Point { get { return IntPoint; } }
}

OUHAH,我编译。那是因为Point隐式转换为PointF:

public static implicit operator PointF(Point p);

但我觉得很脏。

Foo的{​​{1}}坐标为Point,这对我的很多代码都很重要。但有时候,当int只需要Foo时,他的IPointable就不那么重要了。

有没有办法不向我的班级添加愚蠢的属性,仍然int可以使用Foo界面?

2 个答案:

答案 0 :(得分:2)

您可以明确地实现接口:

internal interface IPointable
{
    PointF Point { get; }
}

internal class STH : IPointable
{
    public Point Point { get; set; }

    PointF IPointable.Point
    {
        get { return Point; }
    }
}

现在PointF属性仅在键入IPointable的变量中可见。

答案 1 :(得分:2)

不,您不能选择性地实现接口成员。界面的重点是定义公共合同。通过订阅界面,您需要遵守合同。

如果您希望保留旧的Point媒体资源而不进行更改,implement the interface explicitly

PointF IPointable.Point { get { return Point; } }

通过将Foo投射到IPointable

的引用来使用它
IPointable p = new Foo();
相关问题