待办事项继承权

问题描述:

我有类:待办事项继承权

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

你需要让你的Stage类公开或受保护。如果你把它抽象出来,它就不能在这个层面上实例化,所以如果它的公众不需要担心它被创建为基类

使它成为protected而不是私有。如果您使其受到保护,您可以让从它继承的类调用基类上的方法,并继承基类成员。

+0

然后我得到:在命名空间中定义的元素不能明确声明为private,protected或protected。 – Naor 2011-03-11 17:53:30

您不能使派生类比基类更容易访问。你可以做的是制作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

你可能实际上想要的是Stage是一个抽象基类,因此无论其可访问性修饰符如何,它都不能直接实例化。更改定义阶段:

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

    protected Stage() 
    { 
     Order = 0; 
    } 
} 

受保护的修饰符意味着您的派生类将能够访问该成员,但它不会是这些类的外部访问。