C#8.0:具有默认实现的接口的受保护属性
假设我有以下接口:C#8.0:具有默认实现的接口的受保护属性,c#,c#-8.0,default-interface-member,C#,C# 8.0,Default Interface Member,假设我有以下接口: public interface IReturnableAs { protected String ReturnAs { get; set; } } public interface IReturnableAsImage<T> { protected String ImageResolution { get; set; } public T ReturnAsImage(String imageResolution = "large") { Re
public interface IReturnableAs {
protected String ReturnAs { get; set; }
}
public interface IReturnableAsImage<T> {
protected String ImageResolution { get; set; }
public T ReturnAsImage(String imageResolution = "large") {
ReturnAs = "image";
ImageResolution = imageResolution;
return (T)this;
}
}
public interface IReturnableAsJson<T> {
protected Boolean IsPretty { get; set; }
public T ReturnAsJson(Boolean isPretty = false) {
ReturnAs = "json";
IsPretty = isPretty;
return (T)this;
}
}
public class Foo : IReturnableAsImage<Foo>, IReturnableAsJson<Foo> {...}
公共接口IReturnableAs{
受保护的字符串ReturnAs{get;set;}
}
公共接口IReturnableAsImage{
受保护的字符串ImageResolution{get;set;}
公共T返回图像(字符串图像分辨率=“大”){
ReturnAs=“image”;
图像分辨率=图像分辨率;
返回(T)这个;
}
}
公共接口IReturnableAsJson{
受保护的布尔值IsPretty{get;set;}
public T ReturnAsJson(布尔值isPretty=false){
ReturnAs=“json”;
IsPretty=IsPretty;
返回(T)这个;
}
}
公共类Foo:IReturnableAsImage,IReturnableAsJson{…}
最初,这些错误迫使我实现ReturnAs
、ImageResolution
和IsPretty
属性。使这些实现受保护
的结果是CS0535
,表示没有实现属性。另一方面,将这些公开
给了我CS8704
,告诉我这种实现是不可能的
除了抽象类之外,这些错误还会有解决方法吗?首先,您想要实现什么?什么应该
Foo.ReturnAs
返回?您将如何使用这些接口
如果不继承IReturnableAs
,则无法在其他接口中使用ReturnAs
。一旦您从该接口继承,尽管Foo
必须提供一个实现。当这种情况发生时,无论您如何转换Foo
,您总会得到它自己的ireturableas
实现
接口不是抽象类,因此只能有一个接口成员实现。您不能通过不同的接口访问不同的“默认”实现
通过IReturnableAs访问时的合成结果
如果要为特定接口和图像返回json
或image
;json对于Foo
总体而言,最好的选择是接口不从IReturnableAs
继承,并提供自己的ReturnAs
属性:
public interface IReturnableAs {
public String ReturnAs { get; }
}
public interface IReturnableAsImage<T>
{
public String ReturnAs =>"image";
protected String ImageResolution { get; set; }
public T ReturnAsImage(String imageResolution = "large")
{
ImageResolution = imageResolution;
return (T)this;
}
}
public interface IReturnableAsJson<T> {
public String ReturnAs =>"json";
protected Boolean IsPretty { get; set; }
public T ReturnAsJson(Boolean isPretty = false) {
IsPretty = isPretty;
return (T)this;
}
}
public class Foo : IReturnableAsImage<Foo>, IReturnableAsJson<Foo> ,IReturnableAs
{
string IReturnableAs.ReturnAs =>"image;json";
String IReturnableAsImage<Foo>.ImageResolution { get; set; }="3";
Boolean IReturnableAsJson<Foo>.IsPretty { get; set; }=false;
}
我删除了ReturnAs
设置器,因为同一接口的有效值始终相同
如果要创建生成JPG的新类,例如FooJpg
,可以覆盖IReturnableAsImage
的默认实现,例如:
public class FooJpg : IReturnableAsImage<FooJpg>, IReturnableAsJson<FooJpg> ,IReturnableAs
{
string IReturnableAs.ReturnAs =>"jpg;json";
String IReturnableAsImage<FooJpg>.ImageResolution { get; set; }="3";
Boolean IReturnableAsJson<FooJpg>.IsPretty { get; set; }=false;
String IReturnableAsImage<FooJpg>.ReturnAs => "jpg";
}
在这种情况下,IReturnableAsImage
,IReturnableAsJson
接口提供了一个实现。对于该类:
public class Foo : IReturnableAsImage<Foo>
{
String IReturnableAsImage<Foo>.ImageResolution { get; set; }="3";
}
对于同时使用两个接口的类,需要显式的IReturnableAs
实现:
public class FooMulti : IReturnableAsImage<FooMulti>, IReturnableAsJson<FooMulti>
{
String IReturnableAs.ReturnAs =>"image;json";
String IReturnableAsImage<FooMulti>.ImageResolution { get; set; }="3";
Boolean IReturnableAsJson<FooMulti>.IsPretty { get; set; }=false;
}
它不应该是
IReturnable图像:IReturnable{…}
?因为ireReturnableAsImage
中没有可在ReturnAsImage
中访问的ReturnAs
属性。您希望Foo.ReturnAs
返回什么json
,image
或json;图像
?
public interface IReturnableAs {
public String ReturnAs { get; }
}
public interface IReturnableAsImage<T>:IReturnableAs
{
String IReturnableAs.ReturnAs =>"image";
protected String ImageResolution { get; set; }
public T ReturnAsImage(String imageResolution = "large")
{
ImageResolution = imageResolution;
return (T)this;
}
}
public interface IReturnableAsJson<T>:IReturnableAs {
String IReturnableAs.ReturnAs =>"json";
protected Boolean IsPretty { get; set; }
public T ReturnAsJson(Boolean isPretty = false) {
//ReturnAs="json";
IsPretty = isPretty;
return (T)this;
}
}
public class Foo : IReturnableAsImage<Foo>
{
String IReturnableAsImage<Foo>.ImageResolution { get; set; }="3";
}
void Main()
{
var foo=new Foo();
Console.WriteLine(((IReturnableAs)foo).ReturnAs);
Console.WriteLine(((IReturnableAsImage<Foo>)foo).ReturnAs);
}
public class FooMulti : IReturnableAsImage<FooMulti>, IReturnableAsJson<FooMulti>
{
String IReturnableAs.ReturnAs =>"image;json";
String IReturnableAsImage<FooMulti>.ImageResolution { get; set; }="3";
Boolean IReturnableAsJson<FooMulti>.IsPretty { get; set; }=false;
}
void Main()
{
var foo=new FooMulti();
Console.WriteLine(((IReturnableAs)foo).ReturnAs);
Console.WriteLine(((IReturnableAsImage<FooMulti>)foo).ReturnAs);
Console.WriteLine(((IReturnableAsJson<FooMulti>)foo).ReturnAs);
}
image;json
image;json
image;json