방법 가상을 만드는 데 위험은 무엇입니까?
-
02-07-2019 - |
문제
나는 Rhinomocks로 조롱하는 일을 해왔으며 조롱 방법을 가상으로 만들어야합니다. 현재 가상으로 표시되지 않은 조롱하려는 메소드가 포함 된 사용자 정의 프레임 워크를 제외하고는 괜찮습니다.
이러한 방법을 가상으로 만드는 데 문제가 없지만 찾아야 할 방법을 가상으로 만드는 데 어떤 잠재적 위험이 있는지 궁금해했습니다.
해결책
실제로 메소드가 재정의되도록 설계되지 않았고 누군가가 그것을 무시하는 경우에 매우 문제가 될 수 있습니다. 특히, 생성자에서 가상 메소드를 호출하지 마십시오. 고려하다:
class Base {
public Base() {
InitializeComponent();
}
protected virtual void InitializeComponent() {
...
}
}
class Derived : Base {
private Button button1;
public Derived() : base() {
button1 = new Button();
}
protected override void InitializeComponent() {
button1.Text = "I'm gonna throw a null reference exception"
}
}
파생 클래스는 가상 메소드 호출이 자체 생성기의 한 줄이 실행되기 전에 초기화 성분 메소드가 호출되는 것을 알지 못할 수 있습니다.
다른 팁
- 가상 메서드를 무시하는 사용자가있는 경우 코드를 깨지 않고 다시 밀봉 할 수 없습니다.
- 생성자에서 호출하는 가상 메소드는 파생 구현으로 떨어질 수 있으며 기본 메소드를 호출하지 않고 생성자가 이에 의존하면 객체가 잘못된 상태에있을 수 있습니다.
Ayende는 가상 방법의 작동 방식을 잘 처리합니다.
http://ayende.com/blog/archive/2007/01/05/howvirtualmethodswork.aspx
제휴하지 않습니다 StackOverflow