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

本文关键字:访问 保护 封装 问题 于保护 | 更新日期: 2023-09-27 18:10:02

我对c#非常陌生,并且正在摸索。我理解封装的必要性,但是每当我将一个工作的应用程序分成不同的类时,我总是会遇到问题。我写了一个简单的程序,允许用户点击清单上的复选框。项目显示在一个文本框中,当单击提交按钮时,文本框的内容通过电子邮件发送到预定义的地址。行…

oMsg.Body = Form1.textBox1.text

给我的错误:"MY_App.Form1.textBox1. "由于其保护级别,文本无法访问"。表格1和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);
    }

然后是email类(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;
        }
    }
}

我意识到这是一大堆代码,但我不知道从哪里隔离问题。此外,我非常感谢任何帮助,但如果有人可以解释的答案,以及,这样我就不会继续写糟糕的代码,我真的会很感激。

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

这里有几个问题。第一种情况是,您试图从Form1继承Class1,但您希望在Class1的实例中使用Form1实例的值,而不是从Class1的实例中使用。

让我看看能不能用你们的代号来解释。假设你有一个建筑商,他使用预制部件建造房屋(也就是说,房子是完整的运送给你的)。他有一个基本的房子叫做Form,一个更具体的房子设计叫做Form1,它是基于Form的,还有一个更具体的设计Class1,它是基于Form1的。

你的邻居买了1号房而你买了1号房。你们每个人都有一个叫做TextBox1的邮箱。你在家里,想从邻居的文本框里读他的邮件。因为你的邻居就在街那头,这是不可能的。

有点复杂?确定。

为了正确设计应用程序,继承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");

只要Class1继承自Form1并且文本框访问修饰符为protected,您就可以简单地访问它:

oMsg.Body = this.textBox1.text;

如果textBox是private -为textBox Text属性暴露一个包装器,然后使用它:

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

并使用它:

 oMsg.Body = this.TextWrapper;

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