【问题标题】:Pass property into a class when creating an instance of an interface创建接口实例时将属性传递给类
【发布时间】:2017-07-11 16:03:52
【问题描述】:

我有这个界面:

public interface IMessage
{
    string Subject { get; }
    string Body { get; }
    string ToAddress { get; }
}

然后是一个实现它的类:

public class RestoreEntityMessage : IMessage
{
    public string Subject
    {
        get { return ConfigurationManager.AppSettings["RestoreEntitySubject"]; }
    }
    public string Body
    {
        get { return ConfigurationManager.AppSettings["RestoreEntityBody"]; }
    }
    public string ToAddress
    {
        get { return ConfigurationManager.AppSettings["EntitryToAddress"]; }
    }
}

那么当它被使用时:

IMessage message = new RetireEntityMessage();

但是,我需要将一个字符串传递给Body,每个实例都是唯一的。所以,回到RestoreEntityMessage,我需要做这样的事情:

public string Body
{
    get { return myVar + ConfigurationManager.AppSettings["RestoreEntityBody"]; 
}

但我不知道如何一路获得myVar。我可以这样做吗?

IMessage message = new RetireEntityMessage(myVar);

如果是这样,如何修改类/接口以接受参数?

谢谢!

【问题讨论】:

    标签: c# asp.net .net interface


    【解决方案1】:

    接口中不能有构造函数,但这也意味着你的接口与代码中的任何构造函数无关。

    如果你把你的班级改成这样:

    public class RestoreEntityMessage : IMessage
    {
        private string _someString;
        public RetireEntityMessage(string someString)
        {
            _someString = someString;
        }
    
        public string Body
        {
            get { return _someString + ConfigurationManager.AppSettings["RestoreEntityBody"]; 
        }
    
        public string Subject
        {
            get { return ConfigurationManager.AppSettings["RestoreEntitySubject"]; }
        }
    
        public string ToAddress
        {
            get { return ConfigurationManager.AppSettings["EntitryToAddress"]; }
        }
    }
    

    一切都应该没问题。

    想想接口的作用。它是对象外观的合同。它不关心它的创建,只关心它具有您定义的 shape。添加此构造函数不会破坏任何内容,因为您仍在实现接口的成员。

    【讨论】:

    • 很好的解释。他也可以直接设置 _somString 变量,并使用一个空的构造函数。虽然这并不理想,也没有任何意义,但鉴于他的目标,我只想指出这是可能的。当然,使用该路由,在设置 _someString 之前调用 Body 属性可能会产生意外结果或错误,但这是一个单独的问题。
    【解决方案2】:

    是的 - 只需向类添加一个构造函数...

    public class RestoreEntityMessage : IMessage
    {
        private string _myvar;
    
        public RestoreEntityMessage(string myvar)
        {
            _myvar = myvar;
        }
    
        public string Body
        {
            get { return _myvar + ConfigurationManager.AppSettings["RestoreEntityBody"]; }
        }       
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多