我想要一个带有默认值的方法。
接口:
public interface IMyFormatter
{
Bitmap Generate(string number, int width, int height);
}
具体课程:
public class DefaultFormatter : IMyFormatter
{
private const int DEFAULT_BARCODE_WIDTH = 148;
private const int DEFAULT_BARCODE_HEIGHT = 20;
private const TYPE DEFAULT_BARCODE_TYPE = TYPE.CODE128;
public Bitmap Generate(string Number, int Width = DEFAULT_BARCODE_WIDTH,
int Height = DEFAULT_BARCODE_HEIGHT)
{
var zoneBarcode = new Barcode(Number, DEFAULT_BARCODE_TYPE);
return new Bitmap(zoneBarcode.Encode(DEFAULT_BARCODE_TYPE, zoneBarcode.RawData, barcodeWidth, barcodeHeight));
}
用法:
var number = "1000";
var barcodeToPrint =_barcodeFormatter.Value.Generate(number);
我试图像这样修改接口(并将类中的方法调整为int?):
public interface IMyFormatter
{
Bitmap Generate(string number, int? width = null, int? height = null);
}
但是我类中的值是null,而不是默认值,并且出现异常。
答案 0 :(得分:2)
选项1:在界面中输入默认值。为此,您可能需要将常量提取到另一个类中,该类可以从IMyFormatter
和DefaultFormatter
进行访问(因为接口上不能定义常量):>
public static class FormatterDimensions
{
public const int DEFAULT_BARCODE_WIDTH = 148;
public const int DEFAULT_BARCODE_HEIGHT = 20;
}
public interface IMyFormatter
{
Bitmap Generate(
string number,
int width = FormatterDimensions.DEFAULT_BARCODE_WIDTH,
int height = FormatterDimensions.DEFAULT_BARCODE_HEIGHT);
}
请注意,您还 需要该方法中的默认值,以便支持其他一些CLR语言,例如IronPython:
public class DefaultFormatter : IMyFormatter
{
public Bitmap Generate(
string number,
int width = FormatterDimensions.DEFAULT_BARCODE_WIDTH,
int height = FormatterDimensions.DEFAULT_BARCODE_HEIGHT)
{
}
}
选项2:改用int?
。您需要在界面和实现上都这样做:
public interface IMyFormatter
{
Bitmap Generate(string number, int? width = null, int? height = null);
}
public class DefaultFormatter : IMyFormatter
{
private const int DEFAULT_BARCODE_WIDTH = 148;
private const int DEFAULT_BARCODE_HEIGHT = 20;
public Bitmap Generate(string number, int? width = null, int? height = null)
{
int actualWidth = width ?? DEFAULT_BARCODE_WIDTH;
int actualHeight = height ?? DEFAULT_BARCODE_HEIGHT;
// Use actualWidth and actualHeight in your code
}
}
答案 1 :(得分:0)
调用界面的方法或调用类的方法是有区别的。
因此,例如:
public interface IMyFormatter
{
object Generate(string number, int? width = null, int? height = null);
}
public class DefaultFormatter : IMyFormatter
{
private const int DEFAULT_BARCODE_WIDTH = 148;
private const int DEFAULT_BARCODE_HEIGHT = 20;
private const string DEFAULT_BARCODE_TYPE = "TYPE.CODE128";
public object Generate(string Number, int? Width = DEFAULT_BARCODE_WIDTH, int? Height = DEFAULT_BARCODE_HEIGHT)
{
Console.WriteLine(Number);
Console.WriteLine(Width);
Console.WriteLine(Height);
return new object();
}
}
因此,当您现在创建DefaultFormatter
的新对象并调用Generate()
DefaultFormatter formatter = new DefaultFormatter();
formatter.Generate("100");
//Output: 100
//Output: 148
//Output: 20
但是如果使用接口类型调用它,则会得到以下输出:
((IMyFormatter) formatter).Generate("100");
// Output: 100
// Output: null
// Output: null
创建类时,您将获得与接口类型相同的输出。
IMyFormatter formatter= new DefaultFormatter();
formatter.Generate("100");
// Output: 100
// Output: null
// Output: null