2013-02-18 4 views
-1

Мне нужно наследовать от базового абстрактного класса. Я хочу переопределить только один метод. Но Visual Studio обязывает меня переопределить их всех. поэтому я переопределяю более 10 методов, которые бросают NonImplementedException Я нахожу это глупо. Разве нет способа переопределить только то, что мне нужно. Или, по крайней мере, сообщить Visual Studio о переопределении остальных (не реализованные методы и свойства)?абстрактный класс i не нужно переопределять все методы?

базовый класс написан рамках, так что я не могу изменить его (я говорю о RoleProvider из ASP.Net MVC)

+2

Вы должны только реализовать те, которые не имеют реализацию по умолчанию. Если вы хотите, вы можете добавить реализацию по умолчанию в ваш базовый класс, который возвращает исключение. –

+0

Если вы не будете использовать какой-либо другой метод, вы можете просто оставить фиктивный 'throw new NonImplementedException();' body методов. –

ответ

1

Необходимо более-ездить все методы, которые объявлены в abstract , вы не можете пропустить небетонные методы. Если вы действительно хотите сделать, сделайте свой класс абстрактным. вы не можете изменить механизм абстракции.

Помните
абстрактные классы имеют следующие особенности:
1. Абстрактный класс не может быть создан.
2. Абстрактный класс может содержать абстрактные методы и аксессоры.
3. Невозможно изменить абстрактный класс с помощью запечатанного модификатора, что означает, что класс не может быть унаследован.
4. Не абстрактный класс, полученный из абстрактного класса, должен включать в себя фактические реализации всех унаследованных абстрактных методов и аксессуаров.

2

Нет ли способа переопределить только то, что мне нужно.

Нет, вот как работают абстрактные классы. Если вы также внесете свой класс, вам не нужно выполнять все методы.

2

Настоящая проблема заключается в том, что у вас есть базовый класс с таким количеством методов, что производный класс может работать только с подмножеством из них. Это означает, что ваш базовый класс, скорее всего, имеет множество обязанностей и, таким образом, нарушает Single Responsibility Principle (SRP).

Решение состоит в том, чтобы разбить базовый класс на несколько меньших классов, каждый из которых несет в себе одну ответственность.


Если базовый класс не от вас, вам действительно нужно реализовать все эти методы.
Если базовый класс является классом, который нарушает SRP, и ваша реализация может действительно работать корректно, если вы реализуете только небольшое подмножество методов, которые вы могли бы создать абстрактным базовым классом, полученным из этого другого абстрактного базового класса. В вашем абстрактном базовом классе вы можете реализовать все методы, которые вам не нужны, и выбросить NotImplementedException. Не применяйте те методы, которые вам нужны.
Теперь выведите класс из базового класса - теперь вам нужно только реализовать методы, которые вас интересуют. Обязательно задокументируйте это правильно.

+0

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

+0

@MatthewWatson: Спасибо за подсказку. Поправил мой ответ на этот случай. –

5
abstract class Base 
{ 
     public void Method1() 
     { 
      //some code 
     } // No need to override 
     public abstract void Method2(); // must be overriden 
     public virtual void Method3() 
     { 
      // some code 
     } // Not necessarily be overriden 
} 

class Derived : Base 
{ 
} 

Здесь компилятор только попросит вас overrideMethod2() как мандат. Он не попросит вас переопределить Method1() или Method3(). Ты можешь overrideMethod3() как есть нос. virtual.

+0

Это очень простой способ объяснить это. Спасибо. – AzzamAziz

0

Если метод аннотация, вы должны переопределить.

Если метод виртуальный, вы можете переопределить но не обязательно

Смежные вопросы