Допустим, у меня есть два приложения, каждое с отдельным файлом EAR, которые вызывают друг друга в рамках одной транзакции JTA. Если оба используют один и тот же entitymanager, Я не могу воплотить такой дизайн в жизнь на C #. Я не могу переопределить свойство Value в W, потому что в базовом классе нет сеттера (и его нет, потому что добавление сеттера к базовому классу означает, что он также «просочится» в R).
Я добавил сеттер в A, который выдает исключение. В WI переопределить сеттер, а в R я ничего не делаю.
Это некрасиво из-за дизайна, потому что сеттер в R является общедоступным и потому что теперь такой код компилируется:
R reader;
reader.Value = 5;
Поскольку всегда есть по крайней мере одна любопытная душа, я объясняю - эти классы являются держателями / менеджерами данных. Класс R является «держателем» динамических данных - он вычисляет значение по заданной формуле (аналогично классу Lazy Eval). Большинство вещей типично для W и R - фильтрация значений, отправка уведомлений и так далее. Единственная разница в том, что в R вы не можете установить значение напрямую, потому что формула односторонняя (похожа на конвертер WPF с определенным только одним методом, Convert).
Спасибо Марку, я решил эту проблему здесь это код:
abstract class A {
public int Value { get { return ... } }
}
class R : A { }
class W : A {
new public int Value {
get { return base.Value; }
set { .... }
}
}
Отличие от версии Marc заключается в отсутствии сеттера в базовом классе (в этом весь смысл вопроса), отличие от моего обходного пути заключается в отслеживании свойства, а не в его переопределении. Маленькая, но важная деталь.
Спасибо, Марк, за просветление: -).