C# 在c中实现接口时,如何创建公共静态方法?
我有以下接口C# 在c中实现接口时,如何创建公共静态方法?,c#,C#,我有以下接口 public interface IQueryBuilder { SqlCommand Build(IReportDataSource dataSource, List<IReportColumn> columns, List<IReportRelationMapping> relationMappings, IReportFilterMapping filters, List<IReportColumn> columsToSortBy,
public interface IQueryBuilder
{
SqlCommand Build(IReportDataSource dataSource, List<IReportColumn> columns, List<IReportRelationMapping> relationMappings, IReportFilterMapping filters, List<IReportColumn> columsToSortBy, ReportFormat reportFormat);
string GetSqlClause(List<IReportFilter> reportFilters, ref List<IDataParameter> sqlParams);
}
因为我在GetSqlClause方法上使用static,所以出现了一个错误
无法实现接口成员,因为它是静态的
解决这个问题的好办法是什么?如何直接访问我的GetSqlClause?如果您希望方法是静态的并实现一个接口,该语言不允许您这样做,但您可以通过以下几种方式解决此问题: 如果从静态上下文访问整个实现是有意义的,您可以简单地声明一个单例对象:
public static QueryBuilder Instance { get; } = new QueryBuilder();
现在您可以访问QueryBuilder.Instance静态属性,其值实现IQueryBuilder
通过显式方法实现。这是实现接口方法的附加实例方法,其签名不会与类中的另一个方法冲突
string IQueryBuilder.GetSqlClause(List<IReportFilter> reportFilters, ref List<IDataParameter> sqlParams)
{
// Call the static method, this is *not* a recursive call
return GetSqlClause(reportFilters, ref sqlParams);
}
另一个更简单的解决方案是使用两个不同的方法名
C不支持实现接口方法的静态成员。您希望它是静态的原因是什么?需要吗?只是不要让它是静态的。在接口中有静态成员是没有意义的。为什么不能使用QueryBuilder.GetSqlClause而不是IQueryBuilder.GetSqlClauseSide注意:将System.List作为ref参数传递是一种糟糕的设计。“定期传递,或者更好,就像IList一样。”杰伦,我曾经想知道这一点。我的问题是我不理解接口的意义。你应该仔细阅读测试驱动设计和依赖注入;它不是静态的。@Servy是的,实例方法调用静态方法。这回答了我理解的问题。@Servy我重写了答案,希望能让我的观点更清楚,现在好点了吗?尽管设计可能有问题,但在某些情况下,它可能被证明是有用的。这是正确的,但StackOverflow不是一个琐碎的游戏。接口中的静态成员甚至没有意义,但从您的回答来看,OP可能认为它只是不受支持
string IQueryBuilder.GetSqlClause(List<IReportFilter> reportFilters, ref List<IDataParameter> sqlParams)
{
// Call the static method, this is *not* a recursive call
return GetSqlClause(reportFilters, ref sqlParams);
}
ReturnType InterfaceName.MethodName(ParamType param)
{
...
}