利用可选参数边缘情况通过滥用语言的界面强制实现ToString?

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)

Aus*_*nen 5

听起来你正在使用一个你应该使用抽象类的接口.下面的类明确要求后代已经实现ToString.

abstract class X
{
    public abstract override string ToString();
}
Run Code Online (Sandbox Code Playgroud)


sll*_*sll 1

从我的角度来看,ToString()自定义接口中的此类方法稍微搞乱了事情,因为自定义接口公开了具有标准且众所周知的名称的方法ToString()

我更喜欢更直接、更明显的东西,比如:

string KeyText { get; }
Run Code Online (Sandbox Code Playgroud)

或法

string ConvertKeyToString();
Run Code Online (Sandbox Code Playgroud)