2012-08-13 89 views
0

我有一个简单的System.Drawing.Point(int,int)类。如何在隐式可转换类型之间进行接口?

public class Foo 
{ 
    public Point Point; 
} 

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

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有一个Pointint坐标,这对我的很多代码很重要。但有时候,Foo只需要是IPointable,他的int-并不重要。

有没有办法不给我的班级增加一个愚蠢的属性,而且Foo仍然可以使用IPointable接口?

+0

您可以添加从“Foo”到“IPointable”的隐式转换,这将避免财产,但不会让你感觉干净。一个更好的方法是让自己明白,隐式通常更清晰。 – Jodrell 2012-08-13 09:18:04

+0

出于好奇,OUHAH是什么意思? – 2012-08-13 09:37:28

+0

尝试翻译海军陆战队在海军陆战队快乐时说的话。 – 2012-08-13 09:41:41

回答

2

你可以明确地实现接口:

internal interface IPointable 
{ 
    PointF Point { get; } 
} 

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

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

现在PointF属性是类型化IPointable唯一可见的表单变量。

2

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

如果你想留在原地老Point属性不改变它,implement the interface explicitly

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

而且铸造FooIPointable参考使用:

IPointable p = new Foo(); 
+0

好多了。但我不明白为什么我必须投Foo。它编辑没有演员。 – 2012-08-13 09:35:31

+0

转换将隐式转到接口引用,但如果实现是显式的,则接口引用仍然是必需的。 – 2012-08-13 09:36:24

相关问题