C#中的封装问题(由于保护级别而无法访问)

时间:2011-09-27 15:14:52

标签: c# inheritance encapsulation

我对C#很陌生并且磕磕绊绊。我理解封装的必要性,但每当我将工作应用程序分解为不同的类时,我总是遇到问题。我编写了一个简单的程序,允许用户单击库存清单上的复选框。项目显示在文本框中,单击提交按钮时,文本框的内容将通过电子邮件发送到预定义的地址。这条线...

oMsg.Body = Form1.textBox1.text

给我错误:“MY_App.Form1.textBox1.text由于其保护级别而无法访问”。 Form1和Class1如下......

namespace MY_App 
{ 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
        InitializeComponent(); 
    } 

List<string> ls = new List<string>(); 

private void Checkbox1_CheckedChanged(object sender, EventArgs e) 
{ 
            ls.Add( "P.C. "); 
} 
private void Checkbox2_CheckedChanged(object sender, EventArgs e) 
{ 
        ls.Add( "WYSE Terminal" ); 
} 
private void Checkbox3_CheckedChanged(object sender, EventArgs e) 
{ 

    ls.Add("Dual Monitors ");  
} 
public void button1_Click(object sender, EventArgs e) 
{ 
    InputText(); 
    Class1.SendMail(textBox1.Text);

} 
public void textBox1_TextChanged(object sender, EventArgs e) 
{ 

} 
public void InputText()
    {
        string line = string.Join(",", ls.ToArray());
        textBoxTEST.AppendText(line);
    }

然后是电子邮件类(Class1)......

using System;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace MY_App
{
    public class Class1: Form1
    {
        public void SendMail(string[] args)
        {
            try
            {
                Outlook.Application oApp = new Outlook.Application();
                Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem
                (Outlook.OlItemType.olMailItem);

                Outlook.Recipient oRecip = (Outlook.Recipient)oMsg.Recipients.Add("email@gmail.com");
                oRecip.Resolve();
                oMsg.Subject = "Deskstop Standards: Required Items";
                oMsg.Body = Form1.textBox1.text
                oMsg.Display(true);  
                oMsg.Save();
                oMsg.Send();
                oRecip = null;
                oMsg = null;
                oApp = null;
            }

             catch (Exception e)
            {
                Console.WriteLine("{problem with email execution} Exception caught: ", e);
            }
             return;
        }
    }
}

我重申这是一大堆代码,但我不知道在哪里可以解决这个问题。此外,我非常感谢任何帮助,但如果有人能解释答案,所以我不会继续编写错误的代码,我真的很感激。提前谢谢。

2 个答案:

答案 0 :(得分:2)

这里有几个问题。第一个是你试图从Form1继承Class1,但是你想在Class1的实例中使用Form1实例中的值,而不是从Class1的实例中使用。

让我看看我是否可以使用您的代码名称来解释这一点。假设您有一个使用预制部件构建房屋的建筑商(即房屋整个运送给您)。他有一个名为Form的基础房子,一个名为Form1的更具体的房屋设计,它基于Form,以及一个基于Form1的更具体的设计Class1。

你的邻居买了一个Form1房子然后买了一个Class1房子。你们每个人都有一个名为TextBox1的邮箱。你在家,想要从他的文本框中读出你的邻居邮件1。既然你的邻居在街上,这是不可能的。

有点复杂?当然。

为了正确设计您的应用程序,继承自Form的Form1是正确的。继承自Form1的Class1不是,除非Class1实际上是应用程序中的Form。如果是邮件发件人,您应该创建一个更像这样的类:

public class Class1
{
    public void SendMail(string args)
    {
        try
        {
            var oApp = new Outlook.Application();
            var oMsg = (Outlook.MailItem) oApp.CreateItem(Outlook.OlItemType.olMailItem);
            var oRecip = (Outlook.Recipient) oMsg.Recipients.Add("email@gmail.com");
            oRecip.Resolve();
            oMsg.Subject = "Deskstop Standards: Required Items";
            oMsg.Body = body
            oMsg.Display(true);
            oMsg.Save();
            oMsg.Send();
            oRecip = null;
            oMsg = null;
            oApp = null;
        }
        catch (Exception e)
        {
            Console.WriteLine("{problem with email execution} Exception caught: ", e);
        }
        return;
    }
}

我实际上会使用System.Net.Mail而不是Outlook,但这是另一个教训。要调用它,请使用Form1中的以下内容:

 Class1 mailer = new Class1();
 mailer.SendMail("This is my body message");

答案 1 :(得分:1)

只要Class1继承自Form1且文字框访问修饰符为protected,您就可以直接访问它:

oMsg.Body = this.textBox1.text;

如果textBox为private - 公开文本框Text属性的包装器,然后使用它:

public partial class Form1
{
   public string TextWrapper
   { 
     get
     {
       return this.textBox.Text;
     }

  set
     {
         this.textBox.Text = value;
     }
}

并使用它:

 oMsg.Body = this.TextWrapper;

PS:你的原始代码看起来不对,因为你访问文本框是Form1类的类型成员,基本上就像一个静态变量。