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不是接口的一部分。现在正确的策略是什么?
接口背后的概念是您不需要实现细节。所以很可能你的设计一开始就是错误的。
我假设你想要某种实现,从配置文件中加载设置和一组接口,从各种类别(即数据库连接字符串)中读取设置。
您应该只与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();