Наследование классов: воссоздание элементов (или экземпляров) базового класса из свойства унаследованного класса. - PullRequest
5 голосов
/ 17 октября 2011
  • У меня есть класс A, унаследованный от B.
    • A, так как некоторые свойства только для чтения, которые я хочу изменить из B
    • Скрытие этих свойств с новымне подходит, потому что в базовом классе есть некоторые функции, использующие его собственные свойства ...
    • Невозможно использовать ключевое слово override, поскольку свойства не помечены как абстрактные, виртуальные или переопределенные

Итак, я хотел бы знать, могу ли я из унаследованного класса (B) полностью воссоздать фактический экземпляр моего объекта для доступа к этим свойствам только для чтения.

Например,и для лучшего объяснения, для класса, наследующего Tuple, , если бы это было возможно , я бы сделал что-то вроде этого:

    public new T3 Item3
    {
        get { return item3; }
        set 
        {
            item3 = value;
            base = new Tuple<T1, T2, T3>(Item1, Item2, Item3); // Not valid
        }
    }

Я не вижу, как это сделать?

1 Ответ

7 голосов
/ 17 октября 2011

Кортеж неизменен, поэтому вы не можете изменять его значения. Когда у вас есть неизменяемые объекты, способ изменить их - это вернуть новый объект с измененными желаемыми свойствами. Поэтому, если вы хотите придерживаться кортежей, вы можете сделать что-то вроде этого:

public static class TupleExtensions {
  public static Tuple<T1, T2, T3> 
    WhereItem3Is<T1, T2, T3>(this Tuple<T1, T2, T3> self, T3 newValue) {
    return Tuple.Create(self.Item1, self.Item2, newValue);
  }
  // other methods for Tuple<,,> or other Tuples...
}

И используйте это так:

var t = Tuple.Create(1, 2, 3);
// ...
t = t.WhereItem3Is(4);

Но немного болезненно писать все эти методы. Так что если вам нужно много из них, лучше просто сделайте это:

var t = Tuple.Create(1, 2, 3);
t = Tuple.Create(t1.Item1, t1.Item2, 4);

Вы могли бы даже иметь тип оболочки, который вы бы использовали для ссылки на кортеж из разных мест в вашем коде, чтобы можно было увидеть любые «изменения»:

var t = Tuple.Create(1, 2, 3);
var r = new Ref<Tuple<int, int, int>>(t);
// share r ...
r.Value = Tuple.Create(r.Value.Item1, r.Value.Item2, 4);

...

public class Ref<T> {
  public T Value { get; set; }
  public Ref(T value) { Value = value; } 
}

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

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