Поделиться через


CA1061: не следует скрывать методы базового класса

TypeName

DoNotHideBaseClassMethods

CheckId

CA1061

Категория

Microsoft.Design

Критическое изменение

Критическое изменение

Причина

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

Описание правила

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

Устранение нарушений

Чтобы устранить нарушение этого правила, удалите или переименуйте метод или измените подпись параметра, чтобы метод не скрывал базовый метод.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере демонстрируется метод, нарушающий это правило.

using System;

namespace DesignLibrary
{
   class BaseType
   {
      internal void MethodOne(string inputOne, object inputTwo)
      {
         Console.WriteLine("Base: {0}, {1}", inputOne, inputTwo);
      }

      internal void MethodTwo(string inputOne, string inputTwo)
      {
         Console.WriteLine("Base: {0}, {1}", inputOne, inputTwo);
      }
   }

   class DerivedType : BaseType
   {
      internal void MethodOne(string inputOne, string inputTwo)
      {
         Console.WriteLine("Derived: {0}, {1}", inputOne, inputTwo);
      }

      // This method violates the rule. 
      internal void MethodTwo(string inputOne, object inputTwo)
      {
         Console.WriteLine("Derived: {0}, {1}", inputOne, inputTwo);
      }
   }

   class Test
   {
      static void Main()
      {
         DerivedType derived = new DerivedType();

         // Calls DerivedType.MethodOne.
         derived.MethodOne("string1", "string2");

         // Calls BaseType.MethodOne.
         derived.MethodOne("string1", (object)"string2");

         // Both of these call DerivedType.MethodTwo.
         derived.MethodTwo("string1", "string2");
         derived.MethodTwo("string1", (object)"string2");
      }
   }
}