Подкласс C# с тем же методом
Вопрос
У меня есть суперкласс с двумя подклассами.Оба подкласса имеют метод, проверяющий наличие содержания в главе.Для подкласса 1 этот метод — HasContent(int ChapterID), а для подкласса 2 — HasContent(int ChapterID, int Institution).Как видите, подкласс 2 имеет дополнительный параметр.Цель обоих методов одна и та же.
Я думал поместить метод HasContent в суперкласс.Думаешь, мне нужно это сделать?Если да, то как мне это реализовать?Или разумнее поместить оба метода в отдельный подкласс?
РЕДАКТИРОВАТЬ:
Тело HasDocuments выглядит следующим образом:Подкласс1:
Database DB = new Database();
int res = DB.ExecuteSpRetVal(chapterID, mInstitutionID);
if (res > 0)
return true;
else
return false;
Подкласс2:
Database DB = new Database();
int res = DB.ExecuteSpRetVal(chapterID);
if (res > 0)
return true;
else
return false;
Решение
Редактировать: Обновлено в соответствии с обновлением вопроса.
Поскольку в обоих методах явно используется почти одинаковая логика, я бы провел ее рефакторинг следующим образом:
abstract class SuperClass
{
protected bool HasContentImpl(int chapterID, int institution)
{
Database db = new Database();
int result;
if (institution >= 0) // assuming negative numbers are out of range
result = db.ExecuteSpRetVal(chapterID, institution);
else
result = db.ExecuteSpRetVal(chapterID);
return result > 0;
}
}
class SubClass1 : SuperClass
{
public bool HasContent(int chapterID)
{
return base.HasContentImpl(chapterID, -1);
}
}
class SubClass2 : SuperClass
{
public bool HasContent(int chapterID, int institution)
{
return base.HasContentImpl(chapterID, institution);
}
}
Другие советы
Используйте перегрузку методов, поместив в суперкласс два метода с одинаковыми именами и разными аргументами.Когда вы вызываете HasContent, он будет использовать тот, который соответствует количеству и типам предоставленных вами аргументов.Поскольку он находится в суперклассе, вам не придется создавать еще одну его копию, если позже вы решите создать новый подкласс, также использующий этот метод.См. ниже пример кода;
protected bool HasContent(int chapterID, int institution)
{
Database db = new Database();
int result;
result = db.ExecuteSpRetVal(chapterID, institution);
return result > 0;
}
protected bool HasContent(int chapterID)
{
Database db = new Database();
int result;
result = db.ExecuteSpRetVal(chapterID);
return result > 0;
}
Вы сказали:
Цель обоих методов одна и та же.
так что да, похоже, что у вас есть общий метод, который можно поместить в суперкласс.
Поскольку HasContent() принимает разные дополнения, я бы не стал перемещать его в базовый класс: тот факт, что два метода называются одинаково, не означает, что они делают одно и то же.
Я не знаю ни вашей кодовой базы, ни того, что делает система, над которой вы работаете, однако, учитывая ту небольшую информацию, которой я располагаю, кое-что о вашем проекте чувствует неправильно.В прошлом я обнаружил, что часто возникающие у меня проблемы с дизайном возникают из-за другой проблемы, связанной с моделью данных.Извините, не могу найти помощь, если вы не можете изменить остальную часть системы….