2011-03-11 77 views
4

我有類:待辦事項繼承權

internal class Stage 
{ 
    public long StageId { get; set; } 
    public string StageName { get; set; } 
    public int? Order { get; set; } 

    public Stage() 
    { 
     Order = 0; 
    } 
} 

我也有:

public class GroupStage : Stage 
{ 
    private override long StageId { set { StageId = value; } } 

    public GroupStage() : base() { } 

    public void InsertStage(long groupId) 
    { 
    } 

    public static void SetStageOrder(long stageId, int order) 
    { 
    .... 
    } 

    public static void DeleteStage(long stageId) 
    { 
    .... 
    } 

    public static GroupStage[] GetStages(long groupId) 
    { 
    .... 
    } 
} 

和:

public class TaskStage : Stage 
{ 
    public DateTime? Time { get; set; } 

    public TaskStage() 
     : base() 
    { 
    .... 
    } 

    public static Stage GetNextTaskStage(Guid companyId, long taskId) 
    { 
    .... 
    } 

    public static Stage[] GetTaskStages(Guid companyId, long taskId) 
    { 
    .... 
    } 
} 

這不是工作,我得到異常: 可訪問性不一致:基類Stage比類GroupStage

我想Stage類是私有的,除了GroupStageTaskStage之外沒有訪問權限。我還想讓StageIdGroupStageTaskStage中保密。 我怎樣才能做到這一點,而不重複StageGroupStageTaskStage的成員?

+0

「繼承權」好吧,那麼你的**行爲在哪裏? – 2011-03-11 17:19:58

+0

對不起,但我不明白你的問題。 – Naor 2011-03-11 18:21:33

+0

你在問如何做繼承權,但你的類沒有行爲(除了一些靜態CRUD/ActiveRecord)。如果你想「繼承權」,你的設計將圍繞你的課堂行爲,而不是包裝的屬性。換句話說,我說你做錯了。非常錯誤。 – 2011-03-11 18:23:58

回答

1

你需要讓你的Stage類公開或受保護。如果你把它抽象出來,它就不能在這個層面上實例化,所以如果它的公衆不需要擔心它被創建爲基類

1

使它成爲protected而不是私有。如果您使其受到保護,您可以讓從它繼承的類調用基類上的方法,並繼承基類成員。

+0

然後我得到:在命名空間中定義的元素不能明確聲明爲private,protected或protected。 – Naor 2011-03-11 17:53:30

4

您不能使派生類比基類更容易訪問。你可以做的是製作TaskStage和GroupStage內部,然後繼承和公開接口,以便只有接口在你的程序集之外是可見的。

public interface IGroupStage 
{ 
    public string StageName{ get; set; } 
    ... 
} 

interal class GroupStage : IGroupStage 
{ 
... 
} 
+0

在這個解決方案中,我最終得到了5個文件。我怎樣才能把它們安排在我的圖書館?哪些文件將在哪個文件夾下?這種方法在文件數量方面非常複雜。 – Naor 2011-03-11 17:16:47

+4

正確的OOP通常會導致文件數量的增加。 – MattC 2011-03-11 17:18:40

+0

5個文件在現實世界中並不存在。我花了一段時間才解決了對許多文件的恐懼,然後我意識到沒有理由產生這種恐懼。只需使用文件夾。在這種情況下,我會把所有5個文件放在同一個文件夾中。也許是一個「階段」文件夾。 Visual Studio會自動將它們放在一個子命名空間中,我喜歡它。 – Phil 2011-03-11 17:25:50

1

你可能實際上想要的是Stage是一個抽象基類,因此無論其可訪問性修飾符如何,它都不能直接實例化。更改定義階段:

public abstract class Stage 
{ 
    protected long StageId { get; set; } 
    public string StageName { get; set; } 
    public int? Order { get; set; } 

    protected Stage() 
    { 
     Order = 0; 
    } 
} 

受保護的修飾符意味着您的派生類將能夠訪問該成員,但它不會是這些類的外部訪問。