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