2009-03-09 2 views
2

У меня есть суперкласс с двумя подклассами. У обоих подклассов есть метод с проверкой наличия содержимого главы. Для подкласса 1 этот метод является HasContent (int chapterID), а для подкласса 2 это HasContent (int chapterID, int instit). Как видите, подкласс 2 имеет дополнительный параметр. Цель обоих методов одинакова.C# Подкласс с таким же методом

Я думал о том, чтобы положить метод HasContent в суперкласс. Думаешь, мне нужно это сделать? Если да, то как мне это реализовать? Или разумнее ли использовать оба метода в своем подклассе?

EDIT:

Тело HasDocuments выглядит следующим образом: Subclass1:

Database DB = new Database(); 
int res = DB.ExecuteSpRetVal(chapterID, mInstitutionID); 

if (res > 0) 
    return true; 
else 
    return false; 

Subclass2:

Database DB = new Database(); 
int res = DB.ExecuteSpRetVal(chapterID); 

if (res > 0) 
    return true; 
else 
    return false; 

ответ

6

Редактировать: Обновлено в соответствии с вопросом обновления.

Поскольку вы явно имеющие почти такую ​​же логику в обоих методах, я бы реорганизовать это так:

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); 
    } 
} 
+0

Вы предлагаете положить тело в подклассы? И почему общественность bool HasContent (int chapterID, int институт) является публичной? – Martijn

+0

Да, если есть что-то общее в реализации. Я только что видел ваше редактирование, поэтому я буду соответствующим образом обновлять свой ответ. –

+0

Почему перегрузка HasContent общедоступна? Потому что я предполагаю, что вы хотите назвать это из других классов! :) –

0

Вы сказали:

Цель обоих методы t он такой же

так что да, звучит, что у вас есть общий метод, который вы можете поместить в суперкласс.

0

Как HasContent() принимает различные дополняющая я бы не переместить его в базовый класс, тот факт, что два метода называются одинаковыми, не означает, что они делают то же самое.

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

1

Использовать метод перегрузки путем помещения двух одинаково названных методов с разными аргументами в суперкласс. Когда вы вызываете 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; 
}