Let's say I have interface
public interface IRepository
{
string GetValue();
}
And then I need to extend this interface so it supports cache
public interface ICachedRepository: IRepository
{
void SetCache(string value);
string GetValue(bool ignoreCache = false);
}
As you can see, I want to override GetValue
method so that it has ignoreCache
argument. But it looks like I overload method, instead of overriding it. Is there any way to fully override GetValue
, so that class that implements ICachedRepository
won't need to implement GetValue
from IRepository
?
CodePudding user response:
You can't change the signature when you want to override a method, therefore GetValue(bool)
creates an overload, not an override (that the method has a default argument doesn't make a difference). But your ICachedRepository
does implement GetValue()
as you inherit the base interface.
When you write an implementation for your interface, you have to specify both methods:
public class RepositoryImplementation : ICachedRepository
{
public string GetValue() {...}
public string GetValue(bool ignoreCache) { GetValue(false); }
public void SetCache(string value) {...}
}
The GetValue()
method is part of ICachedRepository
, even though you don't declare an override in it in ICachedRepository
. It's actually illegal to declare overrides in interfaces.
Side note: I would remove the default parameter specification from GetValue(bool ignoreCache = false)
because it's confusing when another overload without the parameter exists. Instead, make sure that calling GetValue()
and GetValue(false)
perform the same operation.