【问题标题】:Inheritance with C#用 C# 继承
【发布时间】:2012-02-07 14:15:46
【问题描述】:

我正在尝试使用继承来使用 ref.class 将字符串从一种形式传递到另一种形式。我看着它,老实说,我认为这应该可行。但是在调试时,我的设置文本框中什么都没有出现...

这是我的参考类:

    class Ref
{

    private String _url;

    public String Sett
    {

        set { _url = value; }
    }
    public String Gett
    {
        get { return _url; }
    }

我从主窗体设置它并从设置窗体中获取它

这是我的主要表单:

    private void webBrowser1_DocumentCompleted(object sender,WebBrowserDocumentCompletedEventArgs e)
        {Ref reff = new Ref();
        this.Text = webBrowser1.Document.Title + " - NHS Cerner Booking Dash";
        textBox1.Text = webBrowser1.Document.Url.ToString();
        reff.Sett = webBrowser1.Document.Url.ToString();

最后这是我的设置表单

    public void load()
    {
        Ref reff = new Ref();
        textBox3.Text = reff.Gett;
    }

我确定这看起来有点复杂。因此,为了澄清我想从主表单中获取 URL 并将其设置为我的 ref.class,然后从 Ref.class 中获取它以将其设置为我的设置表单中的文本框。感谢您的关注。

【问题讨论】:

  • 为什么你有两个属性,一个带有getter,一个带有setter,而不是一个“Value”属性同时带有getter和setter?并不是说那会解决问题...

标签: c# winforms inheritance polymorphism


【解决方案1】:

首先,这与继承无关。

不,它绝对不应该工作。您正在创建两个单独的 Ref 实例 - 因此在其中一个实例中设置值不会使其在另一个实例中可用。您需要创建Ref一个 实例并让两个 表单都知道它 - 以便他们可以将其用作共享通信渠道。

我个人认为这不是在表单之间进行通信的最佳方式 - 例如,您应该考虑使用事件 - 但这就是它目前不起作用的原因。

正如评论中所指出的,拥有两个独立的属性非常奇怪。如果我真的想要这种行为,我会将该类写成:

public class MutableWrapper<T>
{
    public T Value { get; set; }
}

【讨论】:

    【解决方案2】:

    因为你在写“new”时创建了新对象

    public void load()
    {
        Ref reff = new Ref();
        textBox3.Text = reff.Gett;
    }
    

    如果你调试你可以看到 reff 是空的..

    this 应该能帮到你

    【讨论】:

      【解决方案3】:

      您正在每个位置创建一个新的Ref 对象,因此您在webBrowser1_DocumentCompleted 中设置的值与在load 中检索到的值不同。

      【讨论】:

        【解决方案4】:

        您为什么不直接在将要打开的表单中创建一个公共属性。这样您就可以在打开它之前设置它并进一步使用它。

        【讨论】:

          【解决方案5】:

          嗯,开始吧。

          首先我建议你简单化你的课程。

          public class Ref
          {
              public string Url { get; set; }
          }
          

          但这不是问题所在。

          问题是您的Ref 类有两个不同的实例。

          所以你可以做两件事。

          1. 如果这是一个设置表单,您应该将Ref.Url 的值保存到应用程序设置。 或
          2. 您必须将 Ref 的实例传递给您的设置表单。

          【讨论】:

            【解决方案6】:

            您不需要任何 Ref 类。在您的第二个表单中创建一个公共属性,并在创建该表单时访问此属性并分配 URL 的值。

            Click here to see a post which does similar thing.

            在Form2中

             public string URL {get; set;}
            

            在表格 1 中

             Form2 theNewForm = new Form2();
             theNewForm.URL = "your url value";
             theNewForm.Show();
            

            希望这对你有用。

            【讨论】:

            • 这个解决方案被证明是最简单的。非常感谢。
            【解决方案7】:

            好的,这很难看,改为这样做:

            class Ref
            {
            
                private String _url;
            
                public String URL
                {
            
                    set { _url = value; }
                    get { return _url; }
                }
            }
            

            然后,您需要在 main 类中创建一个 Ref 实例,并在创建时将其传递给您的 Settings 类。然后你可以像这样在Settings 类中填写它:

            myref.URL = "whatevergoeshere";
            

            当您的 Settings 对话框完成后,您将能够查看您的 Ref 对象内部并查看 URL 是什么。

            【讨论】:

            • 烦人的是我以前做的是Java,当时真的很简单。很干净,现在用 C# 完全忘记了一切。感谢您的帮助,因为我将在以后使用一些对象时将其用作参考。
            【解决方案8】:

            好吧,你真的没有使用继承......你遇到的问题是你在两个不同的地方声明的 Ref 不一样。

                    private void webBrowser1_DocumentCompleted(object sender,WebBrowserDocumentCompletedEventArgs e)
                    {
                        Ref reff = new Ref();
                        //not the same "Ref" as below
                    }
            
                    public void load()
                    {
                        Ref reff = new Ref();
                        //not the same "Ref" as above
                    }
            
            
                    //consider using properties instead of members... you get the get/set for free
                    public class Ref
                    {
                        public string URL { get; set; }
                        public void Load()
                        {
                            //do your load set
                            this.URL = "What you want";
                        }
                        //...
                    }
            
                    //you can also declare the constructor on the fly if you want.. or call the Load() method
                    Ref myRef = new Ref()
                    {
                        URL = "What you want"
                    };
            

            【讨论】:

              猜你喜欢
              • 2015-04-19
              • 2012-10-30
              • 2023-04-06
              • 2010-11-05
              • 2016-03-02
              • 1970-01-01
              • 2017-03-31
              • 2012-02-13
              • 2015-12-09
              相关资源
              最近更新 更多