C # свойство расщепления получить и установить между классами. Почему это не работает? - PullRequest
0 голосов
/ 23 июня 2009

Я пытаюсь предоставить своим пользователям два класса - один только для чтения и один для записи. Р / о будет иметь только геттеры, а записи будут наследоваться и добавлять сеттеры.

У меня сложилось впечатление, что C # должен справиться с этим, но компилятор не согласился. Почему это не работает? Есть обходные пути?

class A
{
    protected int m_val;
    public int Val
    {
        get { return m_val; }
    }
}

class B : A
{
    public int Val
    {
        set { m_val = value; }
    }
}

class Test
{
    static void Main(string[] args)
    {
        B b = new B();
        b.Val++; // <-- WHY DOESN'T THIS WORK?!
    }
}

P.S. защищенная переменная в приведенном выше примере является искусственной. Мой класс на самом деле обёртывает некоторые нативные ресурсы, и получение / установка происходит по константному или изменчивому нативному указателю.

Ответы [ 3 ]

13 голосов
/ 23 июня 2009

partial относится к одному типу, а не к 2 типам (A и B). Вам нужно что-то более похожее на приведенное ниже, в идеале, оставляя поле приватным:

class A
{
    private int m_val;
    public int Val
    {
        get { return m_val; }
        protected set { m_val = value; }
    }
}

class B : A
{
    public new int Val
    {
        get { return base.Val;}
        set { base.Val = value; }
    }
}
3 голосов
/ 23 июня 2009

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

1 голос
/ 23 июня 2009

Пометить сеттеры как защищенные в родительском объекте и выставить общедоступные сеттеры в дочернем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...