2012-08-13 92 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

相關問題