继承:访问父成员

本文关键字:父成员 访问 继承 | 更新日期: 2023-09-27 18:20:09

我有一个从System.Windows.Forms.Form 继承的类

public partial class RAT : Form

并且具有从RAT 继承的另一个类

class CAD : RAT

当我创建CAD的实例时,我希望RAT(实际上是from)的大小被更改,当我处理CAD对象时,我想要RAT恢复到原来的大小。

CAD构造函数:

    public CAD()
    {            
        base.Size = new System.Drawing.Size(805, 700);
    }

CAD析构器:

    ~CAD()
    {
        base.Size = new System.Drawing.Size(805, 300);
    }

但问题是,它没有执行这些代码。它没有更新表单的size。但当我在RAT中更新它时,它工作得很好:

            CAD CADObject = new CAD();
            this.Size = new System.Drawing.Size(805, 700); 

我认为我正在以正确的方式访问家长班成员。那么问题出在哪里呢?

附加:

之后,我尝试从CAD构造函数添加一个控件:

    public CAD()
    {            
        TextBox sample = new TextBox();
        sample.Multiline = true;
        sample.Location = new System.Drawing.Point(50, 500);
        sample.Size = new System.Drawing.Size(50, 100);
        base.Controls.Add(sample);   //here `base` refers to `RAT` class
    }

但是这个代码不能很好地工作。

整个场景:

RAT是形式,CAD是继承自RAT的一个简单类。CAD对象是在单击RAT按钮时创建的。CAD有一些额外的程序功能,所以我想通过向RAT添加一些额外的控件来更新RAT的UI,并增加其大小,然后从CADmethodsproperties更新它们。

这个程序很简单。我只想从子类访问父成员。我知道我可以在RAT中完成这一切,但我试图从儿童类访问它。这本应该奏效的。

完整代码:

namespace RAT_Controller
{
    public partial class RAT : Form
    {
        public RAT()
        {
            InitializeComponent();              
        }
        CAD CADObject;
        bool CADObjectCreated = false;
        private void btnCADInitializer_Click(object sender, EventArgs e)
        {
            if (!CADObjectCreated)
            {
                CADObject = new CAD();
                CADObjectCreated = true;
            }
            else
            {
                CADObject.Dispose();
                CADObjectCreated = false;
            }           
        }
    }
    class CAD : RAT
    {
        public CAD()
        {        
            base.Size = new System.Drawing.Size(805, 700);  //updating form size
            sample = new TextBox();
            sample.Multiline = true;
            sample.Location = new System.Drawing.Point(50, 500);
            sample.Size = new System.Drawing.Size(50, 100);
            base.Controls.Add(sample);    //adding control to form
        }
        TextBox sample;        
        ~CAD()
        {
            sample.Dispose();
            base.Controls.Remove(sample);  //removing control from form
            base.Size = new System.Drawing.Size(805, 300);   //updating form size
        }
    }
}

继承:访问父成员

CAD是一个全新的表单,您永远不会显示它。屏幕上的形式从未改变。不应该让CADRAD继承,而应该给它一个字段RAD form,并通过该字段访问表单。

你还有一个可疑的终结器。它不会在你期望的时候运行,当它运行时,我怀疑它不会按照你的意愿运行。特别是,它不会在你一调用Dispose时就被调用

class CAD
{
    RAT form;
    public CAD(RAT form)
    {
        this.form = form;
        // Now the CAD class maintains a reference to the form it is
        // supposed to change. This field can be used in other methods
        // when it is time to remove the extra controls and restore
        // the size, like so:
        // form.Size = new System.Drawing.Size(805, 300);
    }
}