c#使用实例化接口的属性

本文关键字:属性 接口 实例化 | 更新日期: 2023-09-27 18:15:25

假设我有一个基本接口

public interface ISettings
{
   void setSettings();
}

public abstract class Settings :ISettings
{
 public void setSettings()
  {
    //do something
  }
}
public class RealSettings : Settings
{
   public string ConnectionString {get;set;}
}

我想这样使用它:

//programstuff
private ISettings settings

settings = new RealSettings();
settings.setSettings();
logger.Debug(settings.ConnectionString);

我当然不能这样用它。因为ConnectionString不是接口的一部分。现在正确的策略是什么?

c#使用实例化接口的属性

接口背后的概念是您不需要实现细节。所以很可能你的设计一开始就是错误的。

假设你想要某种实现,从配置文件中加载设置和一组接口,从各种类别(即数据库连接字符串)中读取设置。

您应该只与Interfaces交谈,而不是实现细节。因此,您在实现中只放置ConnectionString的方法是错误的。它需要在合同的某个地方定义。

:

  • ISettings
  • 中创建属性ConnectionString

或者,如果您不希望它在通用设置中:

  • 创建一个接口IDatabaseSettings并在Realsettings上实现。然后使用private IDatabaseSettings settings

如果你不能改变实现细节,如果你总是知道它是RealSettings

  • 使用(RealSettings)settings.ConnectionString。请注意,这表明设计不好,最好尽早避免这种结构。

这里有一个快速的解决方案。

    public interface ISettings
    {
        void SetSettings(); 
    }
    public interface IDataBaseSettings : ISettings
    {
         string ConnectionString { get; set; }
    }
    public abstract class DatabaseSettings : IDataBaseSettings
    {
        public void SetSettings()
        {
            //todo
        }
        public abstract string ConnectionString { get; set; }
    }
    public class SqlDataBaseSettings : DatabaseSettings
    {
        public override string ConnectionString { get; set; }
    }
 static void Main(string[] args)
  {
        IDataBaseSettings settings  = new SqlDataBaseSettings();
        settings.SetSettings();
        settings.ConnectionString = "Connection String";    
  }

您应该首先选择使用接口还是抽象类。然后,我建议您创建一个实现设置的类,然后在类实例化上实例化您的接口。

public interface ISettings
{
   void setSettings();
} 
    public class realSettings : ISettings
    {  
       public string settings;
       public string ConnectionString;
       public void setSettings(){
       // set the connectionString here the way you want.
       }
    }
ISetting set=new realSettings();