Aracılığıyla paylaş


CA1061: Taban sınıf yöntemlerini gizlemeyin

Özellik Değer
Kural Kimliği CA1061
Başlık Temel sınıf metotlarını gizlemeyin
Kategori Tasarım
Hataya neden olan veya bozulmayan düzeltme Yeni
.NET 8'de varsayılan olarak etkin Öneri olarak

Neden

Türetilmiş bir tür, temel yöntemlerinden biriyle aynı ada ve aynı sayıda parametreye sahip bir yöntem bildirir; parametrelerden biri veya daha fazlası, temel yöntemde karşılık gelen parametrenin temel türüdür; ve kalan parametrelerin, temel yöntemdeki karşılık gelen parametrelerle aynı olan türleri vardır.

Kural açıklaması

Temel türdeki bir yöntem, türetilen yöntemin parametre imzası yalnızca temel yöntemin parametre imzasında karşılık gelen türlerden daha zayıf türlere göre farklılık gösterdiğinde türetilmiş bir türdeki aynı adlı yöntem tarafından gizlenir.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için yöntemi kaldırın veya yeniden adlandırın ya da yöntemin temel yöntemi gizlememesi için parametre imzasını değiştirin.

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan uyarıyı bastırmayın.

Örnek

Aşağıdaki örnekte kuralı ihlal eden bir yöntem gösterilmektedir.

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