只使用方法的实现?
Only implementations of method are used?
在 ISerialized 中,Resharper 抱怨使用了 "Only implementations of 'SerializeShape"。有什么 more 我应该做的吗,或者在这种情况下我对接口的使用只是过度杀戮?我的 'requirements' 是任何使用 class Shape 实现 SerializeShape。我正在尝试以合理、传统的方式使用界面,但也许我不是?
我有这样的界面:
namespace Shapes
{
internal interface ISerialized<in T>
{
string SerializeShape();
}
}
我有一个 class 这样的:
using System.Runtime.Serialization;
using Newtonsoft.Json;
namespace Shapes
{
[DataContract]
public class Shape : ISerialized<Shape>
{
[DataMember] public double Perimeter { get; set; }
[DataMember] public double Area { get; set; }
[DataMember] public string ShapeName { get; set; }
[DataMember] public string ShapeException { get; set; }
public string SerializeShape(Shape shape)
{
return JsonConvert.SerializeObject(shape, Formatting.Indented);
}
}
}
本质上,如果您所做的只是 class 实现一个接口,那么该接口就没有任何用处。必须引用它来代替 class 才能真正发挥作用。用代码解释一个简短的人为示例:
public interface IFoo
{
string Bar();
}
public class Foo : IFoo
{
public string Bar()
{
return "Foo";
}
}
public class FooTwo : IFoo
{
public string Bar()
{
Return "FooTwo";
}
}
public class FooBar
{
public void UseFoo()
{
IFoo foo = new Foo();
string result = foo.Bar();
}
public void UseFooTwo()
{
IFoo fooTwo = new FooTwo()
string result = fooTwo.Bar();
}
}
如您所见,FooBar
中的两种方法都使用 IFoo
而不是 Foo
或 FooTwo
的实际实现。这允许您(或正在实施您编写的部分代码的人)遵守 IFoo
的合同。如果他们已经完成 FooTwo fooTwo = new FooTwo()
那么他们并没有真正从 FooTwo
实施 IFoo
.
中获得任何好处
我知道这是一个老问题,但我刚刚 运行 遇到了类似的情况。
弹出此警告似乎是因为您没有从外部使用它class。也许您只是还没有创建对它的调用,或者在我的例子中,它仅在 class 实现接口的内部使用。
如果你一写接口或者实现接口的时候就弹出这个警告,那说明你还没有使用这个方法。一旦您使用该接口从其他代码调用该方法,警告就会消失。
就我而言,该方法可能曾一度在 class 之外使用,但通过代码的迭代,它现在仅在内部使用。如果我愿意,我可以将方法从 public
更改为 private
并从接口中删除方法声明。
旁白:因为我只有一个 class 实现该接口,所以我可以完全删除该接口,只使用它自己的实现 class,这将完全避免此警告。但是,此接口有多个参考,包括自动化测试。删除界面超出了我need/want所做的更改范围,所以我不打算这样做。
在 ISerialized 中,Resharper 抱怨使用了 "Only implementations of 'SerializeShape"。有什么 more 我应该做的吗,或者在这种情况下我对接口的使用只是过度杀戮?我的 'requirements' 是任何使用 class Shape 实现 SerializeShape。我正在尝试以合理、传统的方式使用界面,但也许我不是?
我有这样的界面:
namespace Shapes
{
internal interface ISerialized<in T>
{
string SerializeShape();
}
}
我有一个 class 这样的:
using System.Runtime.Serialization;
using Newtonsoft.Json;
namespace Shapes
{
[DataContract]
public class Shape : ISerialized<Shape>
{
[DataMember] public double Perimeter { get; set; }
[DataMember] public double Area { get; set; }
[DataMember] public string ShapeName { get; set; }
[DataMember] public string ShapeException { get; set; }
public string SerializeShape(Shape shape)
{
return JsonConvert.SerializeObject(shape, Formatting.Indented);
}
}
}
本质上,如果您所做的只是 class 实现一个接口,那么该接口就没有任何用处。必须引用它来代替 class 才能真正发挥作用。用代码解释一个简短的人为示例:
public interface IFoo
{
string Bar();
}
public class Foo : IFoo
{
public string Bar()
{
return "Foo";
}
}
public class FooTwo : IFoo
{
public string Bar()
{
Return "FooTwo";
}
}
public class FooBar
{
public void UseFoo()
{
IFoo foo = new Foo();
string result = foo.Bar();
}
public void UseFooTwo()
{
IFoo fooTwo = new FooTwo()
string result = fooTwo.Bar();
}
}
如您所见,FooBar
中的两种方法都使用 IFoo
而不是 Foo
或 FooTwo
的实际实现。这允许您(或正在实施您编写的部分代码的人)遵守 IFoo
的合同。如果他们已经完成 FooTwo fooTwo = new FooTwo()
那么他们并没有真正从 FooTwo
实施 IFoo
.
我知道这是一个老问题,但我刚刚 运行 遇到了类似的情况。
弹出此警告似乎是因为您没有从外部使用它class。也许您只是还没有创建对它的调用,或者在我的例子中,它仅在 class 实现接口的内部使用。
如果你一写接口或者实现接口的时候就弹出这个警告,那说明你还没有使用这个方法。一旦您使用该接口从其他代码调用该方法,警告就会消失。
就我而言,该方法可能曾一度在 class 之外使用,但通过代码的迭代,它现在仅在内部使用。如果我愿意,我可以将方法从 public
更改为 private
并从接口中删除方法声明。
旁白:因为我只有一个 class 实现该接口,所以我可以完全删除该接口,只使用它自己的实现 class,这将完全避免此警告。但是,此接口有多个参考,包括自动化测试。删除界面超出了我need/want所做的更改范围,所以我不打算这样做。