Sam*_*der 7 c# optional-parameters
我有一个接口IKey,我想有一个方法,将键作为字符串返回.我们考虑过这样的方法:
String GetAsString();
Run Code Online (Sandbox Code Playgroud)
它将返回字符串表示,但希望能够ToString()在界面中再次声明以强制实现者实现它,但它并没有强制它们,因为它们具有继承自的实现Object.有人建议:
public interface IKey
{
string ToString(string dummyParameter=null);
}
Run Code Online (Sandbox Code Playgroud)
这会强制在任何实现类中实现该方法,但是由于可选参数的工作方式,调用者不需要为此提供值,并确保ToString()对作为接口的对象的方法的任何调用IKey或者实现类将始终调用类实现而不是Object实现.
在实现中,我们可以忽略dummyParameter并返回我们想要的东西,安全地知道调用ToString()将始终实际调用ToString(null).
现在这对我来说都是错误的,但与此同时它确实有一些相当不错的东西.它几乎与拥有一个方法完全相同,因为它GetAsString()只能在IKey接口和派生类上调用,除了它看起来像ToString()我们想要使用的更自然的方法,并且我们能够强制在子类中实现它.
说过没有使用的伪参数感觉不对.
这可怕吗?还是很棒?
这个问题是适合SO还是适用于程序员?
例子
public class Key :IKey
{
public string ToString(string abc = null)
{
return "100";
}
}
Key key = new Key ();
Trace.WriteLine (key.ToString());
Trace.WriteLine (key.ToString(null));
Trace.WriteLine (key.ToString("ac"));
Trace.WriteLine (((object)key).ToString());
Run Code Online (Sandbox Code Playgroud)
输出:
100
100
100
Blah.Tests.Key
Run Code Online (Sandbox Code Playgroud)
听起来你正在使用一个你应该使用抽象类的接口.下面的类明确要求后代已经实现ToString.
abstract class X
{
public abstract override string ToString();
}
Run Code Online (Sandbox Code Playgroud)
从我的角度来看,ToString()自定义接口中的此类方法稍微搞乱了事情,因为自定义接口公开了具有标准且众所周知的名称的方法ToString()。
我更喜欢更直接、更明显的东西,比如:
string KeyText { get; }
Run Code Online (Sandbox Code Playgroud)
或法
string ConvertKeyToString();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |