Udostępnij za pośrednictwem


CA1061: Nie należy ukrywać metod klasy podstawowej

TypeName

DoNotHideBaseClassMethods

CheckId

CA1061

Kategoria

Microsoft.Design

Zmiana kluczowa

Kluczowa

Przyczyna

Typ pochodny deklaruje metodę, o tej samej nazwie i z taką samą liczbą parametrów co jedna z jego metod podstawowych; jeden lub więcej parametrów jest typem podstawowym odpowiadającego mu parametru w metodzie podstawowej; a wszystkie pozostałe parametry typów są identyczne z odpowiednimi parametrami metody podstawowej.

Opis reguły

Metoda w typie podstawowym jest ukryta przez metodę o identycznej nazwie typu pochodnego, gdy sygnatura parametru metody pochodnej różni się tylko typami, które są bardziej słabo dziedziczone niż odpowiadające typy w sygnaturze parametru metody podstawowej.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, usuń lub zmień nazwę metody lub zmienić sygnaturę parametru, tak aby metoda nie ukrywała metody podstawowej.

Kiedy pomijać ostrzeżenia

Nie należy pomijać ostrzeżenia dotyczącego tej reguły.

Przykład

W poniższym przykładzie przedstawiono metodę, która narusza regułę.

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");
      }
   }
}