c# - 继承:访问父成员

标签 c# inheritance

我有一个继承自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);
    }

但问题是,它没有执行这段代码。它不会更新表单的大小。但是当我在 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 ,并从 CAD methodsproperties 更新它们。

程序非常简单。我只想从子类访问父成员。我知道我可以在 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 是一种全新的表单,您永远不会显示它。屏幕上的形式永远不会改变。您不应让 CAD 继承于 RAD,而应为其指定一个字段 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);
    }
}

关于c# - 继承:访问父成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17357927/

相关文章:

c# - 接口(interface)和包装器太多?

c# - 代码适用于一种情况,但不适用于其他情况

c++ - 具有相同名称的继承函数如何被视为重载函数?

language-agnostic - 为什么箭头在继承中上升?

c# - Azure 中的 "number of databases"意味着什么?

c# - 使用NReco视频转换器,Format.flv引用无法解决

c# - Winforms 托管 Javascript 内容

java - 提取参数化类型的值时,将参数化类型类参数转换为子类形式

C++派生类链构造函数错误

C++ 循环依赖