Некоторые из моих классов имеют одинаковый код для хранения ошибок. Это два свойства ошибки (число и сообщение) и несколько методов для установки состояния ошибки. Этот код повторяется в каждом классе, поэтому сегодня я решил реорганизовать общий код и извлечь его, чтобы его можно было повторно использовать.Реализация абстрактного класса, когда цель уже реализует один
Сначала я попытался создать его как интерфейс, но я мог бы заставить его работать. На моем программистом VB.net я думал, что это просто вопрос перемещения кода и ссылки на него. Но интерфейсы не смогли обработать код. Итак, я создал абстрактный класс и начал наследовать другие классы.
public class DBEngine : ErrorContainer, IDisposable {
protected DBEngine(string connectionString, string providerName)
public DBEngine(string connectionString = "")
}
Но тогда я столкнулся с проблемой, когда мои классы уже имеют наследование.
public abstract class TypedTable<TRow> : TypedTableBase<TRow> where TRow : TypedRow {
protected TypedTable(SerializationInfo info, StreamingContext context) : base(info, context)
protected TypedTable()
}
Если я наследовать интерфейс, он хочет, чтобы я заново выполнять все функции, которые мне кажется непродуктивным.
Как я могу структурировать свой код хранения ошибок, чтобы его можно было повторно использовать на моих классах, даже если у них уже есть наследование, но избежать перезаписи какого-либо кода?
ПРИМЕЧАНИЕ. Пожалуйста, не путайте то, что я говорю там, с некоторой обработкой ошибок. Для обработки ошибок я использую NLog и имею свой собственный уровень интерфейса и статическую реализацию. Что я там говорю, это повторное использование некоторых свойств, которые имеют несколько классов, что происходит для хранения кода ошибки и сообщения. Больше ничего.
ClassA
L public Property1
L public Property2
L private MethodToSet1And2
ClassB : Something (problem there)
L public Property1
L public Property2
L private MethodToSet1And2
Такие же свойства и способ.
Ответы выходят за рамки, поскольку предлагаемые решения изолируют свойства от вызывающего абонента A и B. Реальное использование их точно передает вызывающей информации некоторую информацию. Не выполняйте какое-либо внешнее многоразовое действие.
Обработка ошибок, вероятно, следует извлечь из в класс, посвященный, что в одиночку, а затем друг с другом класс может иметь экземпляр этого. – jmcilhinney
Но процессы, требующие обслуживания (DBEngine), также должны видеть свойства ErrorManager, так как они где-то в нем. Например, если (DbEngine.ErrorNumber! = 0) ProcessTheError (DbEngine.Error()); – Sergio
В соответствии с принципами SOLID ни один из ваших подобных классов не выполняет управление ошибками. Как отмечали другие ребята, вы должны переместить код ошибки mgmt в совершенно новый класс. Вы можете создать * интерфейс *, который определяет, какую ошибку будет выполнять класс mgmt. Затем используйте конструктор или вложение свойств, чтобы предоставить экземпляр экземпляра ошибки mgmt из вызывающего кода. Более того, код обработки ошибок, похоже, не зависит от состояний объекта, поэтому вы также можете выбрать простой статический класс. – niksofteng