2015-08-03 2 views
3

Я реорганизую уже существующее решение. Я использую ReSharper, и я заметил, что правило проверки кода отключено. Существует абстрактный класс, который имеет сигнатуры метода bodyless с намерением заставить производные классы (которых их несколько). Насколько мне известно, это (или хотя бы) правильный способ сделать что-то. Однако ReSharper жалуется, что «член типа никогда не доступен через базовый тип» и что «используются только переопределения [методов]». Вот пример кода, который копирует этот вопрос в вопрос:Что не так с абстрактными методами bodyless в абстрактном классе?

public abstract class MyAbstractClass 
{ 
    public abstract void CreateSomething(); 
    public abstract void ReadSomething(); 
    public abstract void InsertSomething(); 
} 

public class MyDerivedClass : MyAbstractClass 
{ 

    public override void CreateSomething() 
    { 
     throw new NotImplementedException(); 
    } 

    public override void ReadSomething() 
    { 
     throw new NotImplementedException(); 
    } 

    public override void InsertSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 

Кстати, есть и другие члены, которые исключают создания абстрактного класса интерфейс. ReSharper предлагает внести изменения в 3 метода в абстрактном классе. Предложено сделать их защищенными, виртуальными, не абстрактными или просто удалить их из абстрактного класса и только иметь их в производных классах. Тот, кто изначально написал этот код, предназначенный для каждого производного класса для реализации этих методов, и для того, чтобы эти методы были общедоступными в производных классах. Итак, есть ли способ изменить это, чтобы сделать его более эффективным? Если нет, то почему ReSharper делает с этим проблему?

+0

У вас есть общий анализ? Нижний правый угол, зеленый радар-вид-thingy. –

+0

@JeroenVannevel - Да, я знаю. – bubbleking

+2

Это говорит вам, что, поскольку он замечает, что в решении нет другого подкласса, который реализуется из базового класса, по существу делая его бесполезным. Удивительно, что он показывает это предупреждение с «публичными» классами - вы уверены, что они есть? Чтобы проверить мое предложение: добавьте второй класс к вашему решению и наследуйте его от абстрактного класса. Это устраняет предупреждение? –

ответ

2

Поскольку вы никогда не обращаетесь к методу с использованием ссылки типа MyAbstractClass, нет смысла делать его абстрактным членом - вы можете полностью исключить его из базового класса, и все будет скомпилировано просто отлично.

+0

Точка, которую я читаю из намерений предыдущего разработчика, заключается в обеспечении того, чтобы все производные классы реализуют эти методы. Если это исключено из базового класса, как это возможно? – bubbleking

+4

@bubbleking Вероятно, это предупреждение от resharper, что *, поскольку код теперь * - вам не нужно использовать абстрактный класс. Попытка лить ваш объект в «MyAbstractClass» и использовать этот метод. Поэтому вместо этого: 'var something = new MyDerivedClass(); something.CreateSomething(); 'Использовать:' MyAbstractClass something = new MyDerivedClass(); something.CreateSomething(); '. В любом случае вы можете игнорировать предупреждение от resharper, так как, вероятно, вы * будете * ссылаться на методы через MyAbstractClass в будущем (в противном случае это правильно, если говорить, что абстрактный метод не требуется). – Rob

+0

@Rob - Это потрясающее объяснение. Возможно, объедините свои комментарии в ответ? – bubbleking

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