待办事项继承权
我有类:待办事项继承权
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
类是私有的,除了GroupStage
和TaskStage
之外没有访问权限。我还想让StageId
在GroupStage
和TaskStage
中保密。 我怎样才能做到这一点,而不重复Stage
GroupStage
和TaskStage
的成员?
你需要让你的Stage类公开或受保护。如果你把它抽象出来,它就不能在这个层面上实例化,所以如果它的公众不需要担心它被创建为基类
使它成为protected
而不是私有。如果您使其受到保护,您可以让从它继承的类调用基类上的方法,并继承基类成员。
然后我得到:在命名空间中定义的元素不能明确声明为private,protected或protected。 – Naor 2011-03-11 17:53:30
您不能使派生类比基类更容易访问。你可以做的是制作TaskStage和GroupStage内部,然后继承和公开接口,以便只有接口在你的程序集之外是可见的。
public interface IGroupStage
{
public string StageName{ get; set; }
...
}
interal class GroupStage : IGroupStage
{
...
}
在这个解决方案中,我最终得到了5个文件。我怎样才能把它们安排在我的图书馆?哪些文件将在哪个文件夹下?这种方法在文件数量方面非常复杂。 – Naor 2011-03-11 17:16:47
正确的OOP通常会导致文件数量的增加。 – MattC 2011-03-11 17:18:40
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;
}
}
受保护的修饰符意味着您的派生类将能够访问该成员,但它不会是这些类的外部访问。
“继承权”好吧,那么你的**行为在哪里? – 2011-03-11 17:19:58
对不起,但我不明白你的问题。 – Naor 2011-03-11 18:21:33
你在问如何做继承权,但你的类没有行为(除了一些静态CRUD/ActiveRecord)。如果你想“继承权”,你的设计将围绕你的课堂行为,而不是包装的属性。换句话说,我说你做错了。非常错误。 – 2011-03-11 18:23:58