Право наследования - PullRequest
       4

Право наследования

4 голосов
/ 11 марта 2011

У меня есть класс:

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?

Ответы [ 4 ]

4 голосов
/ 11 марта 2011

Вы не можете сделать производный класс более доступным, чем его базовый класс. Что вы можете сделать, так это сделать TaskStage и GroupStage внутренними, а затем наследовать и предоставлять открытые интерфейсы, чтобы за пределами вашей сборки был виден только интерфейс.

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

interal class GroupStage : IGroupStage
{
...
}
1 голос
/ 11 марта 2011

Что вам, вероятно, действительно нужно, так это чтобы Stage был абстрактным базовым классом, который, следовательно, не может быть непосредственно создан независимо от его модификатора доступности.Измените определение Stage:

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

    protected Stage()
    {
        Order = 0;
    }
}

Защищенный модификатор означает, что ваши производные классы смогут получить доступ к этому члену, но он не будет доступен вне этих классов.

1 голос
/ 11 марта 2011

Сделайте это protected вместо личного.Если вы делаете его защищенным, вы позволяете классам, которые наследуют его, вызывать методы базового класса и наследовать членов базового класса.

1 голос
/ 11 марта 2011

Вы должны сделать свой класс Stage публичным или защищенным. если вы сделаете его абстрактным, его нельзя будет создать на этом уровне, поэтому, если он общедоступен, вам не нужно беспокоиться о том, что он будет создан как базовый класс

...