2013-10-04 59 views
1

這裏就是我想要做的事:通過在C#中的抽象類顯式執行財產

在頂部坐在接口:

interface IHasPosition 
    { 
     Position Position 
     { 
      get; 
     } 
    } 

接下來,我們有一個抽象類:

abstract class Person : IHasPosition 
    { 
     public abstract Position Position 
     { 
      get; 
     } 
    } 

最後,我向人:

class Instructor : Person 
    { 
     public override Position Position 
     { 
      get { return new Position(1, 1); } 
     } 
    } 

這個編譯得很好。但是,我似乎無法明確定義屬性Position。事情是這樣的:

class Instructor : Person 
    { 
     public override Position IHasPosition.Position 
     { 
      get { return new Position(1, 1); } 
     } 
    } 

這無法編譯:

Error 1 'ConsoleApplication3.Instructor.IHasPosition.Position': virtual or abstract members cannot be private 
Error 3 The modifier 'override' is not valid for this item 
Error 2 The modifier 'public' is not valid for this item 
+0

你爲什麼要明確地實現接口的屬性? – Alireza

+0

修飾符'public'對這個項目無效 - 你試圖明確地實現它;修飾符'override'對此項無效 - 再次涉及到第一條語句 – terrybozzio

+0

你想要做什麼?我的意思是爲什麼抽象實現基類和私人派生?或者你想公開派生? – terrybozzio

回答

3

Instructor被繼承PersonInstructor.Position是壓倒Person.Position

由於Person.Position已實施IHasPosition.Postion,因此Instructor.Position也是如此。

InstructorPersonIHasPosition

顯式實現接口IHasPosition.PositionInstrcutor是不必要的,並且會引起誤解。

讓您明確實現已被繼承的接口。在覆蓋它是多餘的,並且是非法的,因爲它的public,在另一個成員上它創造了一個模糊性。

1

您的代碼中存在語法錯誤:顯式接口實現不能爲public。 從技術上講,你可以把它像:

class Instructor: Person { 
    // From Person abstract class 
    public override Position Position 
    { 
     get { return new Position(1, 1); } 
    } 

    // Explicit interface implementation 
    Position IHasPosition.Position 
    { 
     get { ... } 
    } 
    } 

但作爲Jodrell說,這是一個非常不良風氣

+0

+1表示你實際上可以做到。 (對任何真正做到的人都是-1) – Jodrell

+0

這似乎仍然不起作用。它抱怨包含未實現IHasPosition的類型: 錯誤\t'ConsoleApplication3.Instructor.IHasPosition.Position':包含類型未實現接口'ConsoleApplication3.IHasPosition' –