1

Resharper 경고 여기에 EditMyDataObject 속성을 설정하는 기본 폼 및 확장 된 폼에서 텍스트 값을 잡고 나중에 복원합니다.

두 경우 모두 앱을 실행할 때 아무 것도 울리지 않습니다. 재정의 된 속성이 생성자에서 초기화 된 항목에 종속되지 않기 때문에 구현 된 문제에 대한 잠재 성이 있다고 생각하지 않지만 Resharper를 재촉하기 전에 제 2의 의견에 감사드립니다.

public class MyDataObject
{
    //Data Members

    public MyDataObject()
    {
    }
}

public class MyDataObjectEx : MyDataObject
{
    //Data Members

    public MyDataObjectEx()
    {
    }

    public MyDataObjectEx(MyDataObject myDataObject)
    {
    }       
}

public partial class MyDataObjectEditFrm : Form
{
    private MyDataObject _myDataObject;

    protected virtual MyDataObject EditMyDataObject
    {
        get { return _myDataObject; }
        set { _myDataObject = value; }
    }

    /// <summary>
    /// Parameterless constructor needed for designer support of derived classes.
    /// </summary>
    protected MyDataObjectEditFrm()
    {
        InitializeComponent();
    }

    protected MyDataObjectEditFrm(MyDataObject myDataObject)
    {
        InitializeComponent();
        EditMyDataObject = myDataObject;  // Warning: Virtual member call in a constructor

        Text = GetDialogNameFromInputParameters()

        //Remainder of initialization here
    }

    GetDialogNameFromInputParameters()
    {
        //Figure out what the text should be
    }
}


public partial class MyDataObjectExEditFrm : MyDataObjectEditFrm
{
    private MyDataObjectEx _myDataObjectEx;

    protected override MyDataObject EditMyDataObject
    {
        get { return _myDataObjectEx; }
        set
        {
            if (value == null)
                _myDataObjectEx = null;
            else _myDataObjectEx = value as MyDataObjectEx ?? new MyDataObjectEx(value);
        }

    }

    public MyDataObjectExEditFrm(MyDataObject myDataObject) : base(myDataObject)
    {
        //preserve the value computed and set in the base class to prevent the generic form name from the designer overriding it here
        string dialogText = Text; // Warning: Virtual member call in a constructor
        InitializeComponent();
        Text = dialogText; // Warning: Virtual member call in a constructor


        //Remainder of additional initialization for extended data here
    }
}


  • 편집 : 잘못, 다니엘 감사합니다원하는 경우 속성 대신 기본 변수를 설정하여 첫 번째 경고를 제거 할 수 있습니다. 이것이 좋은 생각인지 아닌지에 대한 의견이 없습니다. 단지 말하고 있습니다. - jv42
  • @ jv42 : 그 행동을 바꿀 것입니다. 오버라이드 된 속성을 살펴보면 일부 논리가 있습니다 ... - Daniel Hilgarth
  • @ vj42 : 내가 그랬다고 생각하지만, MyDataObjectExEditForm이 기본 MyDataObject를 전달할 때 문제가 발생했다. MyDataObjectExEditForm은 MyDataObjectEx - Dan Neely
  • 예. 죄송합니다. 실제로 파생 클래스에서이 클래스를 재정의 한 사실을 놓쳤습니다. - jv42
  • 가상 호출을 항상 추상 메소드로 파이프 할 수 있습니다.이 메소드는 파생 클래스가이 추상 메소드를 강제 실행하도록합니다. 이것은 클래스가 메소드를 구현하지 못한다는 것을 의미합니다. 즉, 상속 된 클래스에서 누락 된 메소드에 오류가 없어 질 수 없음을 의미합니다. 이 미래는 당신의 수업을 증명합니다. - Contango

1 답변


6

각 파생 클래스가 파생 클래스의 생성자에서 초기화되는 변수에 의존하지 않는 방식으로이 가상 멤버를 재정의하는 한 안전합니다. 문제는 기본 클래스에서 파생되는 모든 클래스가 이와 같이 작동한다는 것을 알 수 없습니다. 그 때문에 경고는 합법적입니다.


  • 나는 미래에 일들을 망칠 수 있다는 것을 알았다. 공공 도서관이 아니기 때문에 기능을 잃지 않고 재 설계 할 수 있다면 위험을 관리 할 수 있습니다. - Dan Neely

관련된 질문

최근 질문