재정의 가능한 메서드를 생성자에서 호출하지 마십시오.
업데이트: 2007년 11월
TypeName |
DoNotCallOverridableMethodsInConstructors |
CheckId |
CA2214 |
범주 |
Microsoft.Usage |
변경 수준 |
사용자 이름 |
원인
unsealed 형식의 생성자에서 해당 클래스에 정의된 가상 메서드를 호출합니다.
규칙 설명
가상 메서드가 호출되면 메서드를 실행하는 실제 형식이 런타임이 될 때까지 선택되지 않습니다. 생성자가 가상 메서드를 호출할 때 이 메서드를 호출하는 인스턴스의 생성자가 실행되지 않았을 가능성이 있습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 형식의 생성자 안에서 형식의 가상 메서드를 호출하지 않도록 합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다. 생성자를 다시 디자인하여 가상 메서드에 대한 호출을 제거해야 합니다.
예제
다음 예제에서는 이 규칙을 위반했을 경우 미치는 영향을 보여 줍니다. 테스트 응용 프로그램에서는 기본 클래스(BadlyConstructedType) 생성자를 실행시키는 DerivedType의 인스턴스를 만듭니다. BadlyConstructedType의 생성자는 가상 메서드 DoSomething을 잘못 호출합니다. 출력에서 볼 수 있듯이 DerivedType.DoSomething()은 DerivedType의 생성자가 실행되기 전에 실행됩니다.
Imports System
Namespace UsageLibrary
Public Class BadlyConstructedType
Protected initialized As String = "No"
Public Sub New()
Console.WriteLine("Calling base ctor.")
' Violates rule: DoNotCallOverridableMethodsInConstructors.
DoSomething()
End Sub 'New
' This will be overridden in the derived type.
Public Overridable Sub DoSomething()
Console.WriteLine("Base DoSomething")
End Sub 'DoSomething
End Class 'BadlyConstructedType
Public Class DerivedType
Inherits BadlyConstructedType
Public Sub New()
Console.WriteLine("Calling derived ctor.")
initialized = "Yes"
End Sub 'New
Public Overrides Sub DoSomething()
Console.WriteLine("Derived DoSomething is called - initialized ? {0}", initialized)
End Sub 'DoSomething
End Class 'DerivedType
Public Class TestBadlyConstructedType
Public Shared Sub Main()
Dim derivedInstance As New DerivedType()
End Sub 'Main
End Class
End Namespace
using System;
namespace UsageLibrary
{
public class BadlyConstructedType
{
protected string initialized = "No";
public BadlyConstructedType()
{
Console.WriteLine("Calling base ctor.");
// Violates rule: DoNotCallOverridableMethodsInConstructors.
DoSomething();
}
// This will be overridden in the derived type.
public virtual void DoSomething()
{
Console.WriteLine ("Base DoSomething");
}
}
public class DerivedType : BadlyConstructedType
{
public DerivedType ()
{
Console.WriteLine("Calling derived ctor.");
initialized = "Yes";
}
public override void DoSomething()
{
Console.WriteLine("Derived DoSomething is called - initialized ? {0}", initialized);
}
}
public class TestBadlyConstructedType
{
public static void Main()
{
DerivedType derivedInstance = new DerivedType();
}
}
}
이 예제의 결과는 다음과 같습니다.
Calling base ctor.
Derived DoSomething is called - initialized ? No
Calling derived ctor.