如何在c#abstract方法中指定可选的匿名ienumerable参数

如何在c#abstract方法中指定可选的匿名ienumerable参数,c#,C#,我有以下基类 public abstract class BaseRepository<T> { public abstract IEnumerable<T> GetAll(); } public class Sales { public int Id { get; set; } public int CustomerId {get;set;} public decimal Total {get;set;} } 这不起作用 public

我有以下基类

public abstract class BaseRepository<T>
{
    public abstract IEnumerable<T> GetAll();
}
public class Sales
{
    public int Id { get; set; }
    public int CustomerId {get;set;}
    public decimal Total {get;set;}
}
这不起作用

public class SalesRepository: BaseRepository<Sales>
{
    public override IEnumerable<Sales>GetAll(IEnumerable<Customer> Customers)
    {
        return null;
    }
}
公共类SalesRepository:BaseRepository
{
公共覆盖IEnumerableGetAll(IEnumerable客户)
{
返回null;
}
}
我的问题是,如何修改基类,使其具有可选的ienumerable参数,然后根据需要使用。
GetAll(ienumerable Customers)
函数相当于一种新方法。它没有与基相同的签名,因此不能以这种方式重写。
SalesRepository
类如果要成为
BaseRepository
,必须按原样实现
GetAll()
方法。
GetAll(IEnumerable Customers)
函数相当于一个新方法。它没有与基相同的签名,因此不能以这种方式重写。
SalesRepository
类如果要成为
BaseRepository
,则必须按原样实现
GetAll()
方法。

您可以或可以在基类中对该方法进行重载,这两者都将导致相同的结果。当您将参数标记为可选参数时,编译器只会为您进行重载

public class CustomerRepository: BaseRepository<Customer>
{
    public override IEnumerable<Customer>GetAll()
    {
        return null;
    }
}


public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}
最终,您可能需要在基类中创建两个方法,然后在每个父类的实现中隐藏一个(使其私有),或者让它抛出一个错误。如果您能找到一种使用默认值的好方法,那么这可能也会起作用。

您可以或者可以在基类中对方法进行重载,这两者都会导致相同的结果。当您将参数标记为可选参数时,编译器只会为您进行重载

最终,您可能需要在基类中创建两个方法,然后在每个父类的实现中隐藏一个(使其私有),或者让它抛出一个错误。如果你能想出一个好方法来设置默认值,那么这也可能会起作用。

你可以做这个改变

public class SalesRepository : BaseRepository<Sales>
{
    public override IEnumerable<Sales> GetAll()
    {
        return GetAll(null);
    }

    public IEnumerable<Sales> GetAll(IEnumerable<Customer> Customers)
    {
        return null;
    }
}

BaseRepository<Sales> rep = new SalesRepository();
rep.GetAll();
你可以做这个改变

public class SalesRepository : BaseRepository<Sales>
{
    public override IEnumerable<Sales> GetAll()
    {
        return GetAll(null);
    }

    public IEnumerable<Sales> GetAll(IEnumerable<Customer> Customers)
    {
        return null;
    }
}

BaseRepository<Sales> rep = new SalesRepository();
rep.GetAll();

你不能。通过重写,不允许更改方法的签名。你可以在你的方法中尝试
new
修饰符你能举个例子吗,恐怕我有点生疏新修饰符隐藏了一个方法而不是重写,但在这种情况下它对你没有帮助。您必须使用完全相同的签名实现抽象类中声明的GetAll()方法。有趣的是,在哪里使用GetAll()方法,为什么选择抽象方法?也许你可以用代理来代替。@RedSoxFred我已经发布了一个答案,请检查你不能。通过重写,不允许更改方法的签名。你可以在你的方法中尝试
new
修饰符你能举个例子吗,恐怕我有点生疏新修饰符隐藏了一个方法而不是重写,但在这种情况下它对你没有帮助。您必须使用完全相同的签名实现抽象类中声明的GetAll()方法。有趣的是,在哪里使用GetAll()方法,为什么选择抽象方法?也许您可以使用委托人。@ ReSoxfRead,我已经发布了一个答案,如果代码< > CuuleRealStaby支持一个附加的操作,即:<代码> GETALL(iQuestabueCudio)(顺便说一下,我会考虑重命名),它可以在那里声明和实现,而不是在基类中。但是,您仍然需要实现基<代码> GETALL()/Cux>方法。如果一个代码> CuuleRealStaby支持一个附加的操作,即:<代码> GETALL(IQuestBuy客户)(顺便说一下,我将考虑重命名),它可以在那里声明和实现,而不是在基类中实现。但是,您仍然必须实现base
GetAll()
方法。