方法中的默认值

时间:2019-03-15 15:33:09

标签: c#

我想要一个带有默认值的方法。

接口:

 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,而不是默认值,并且出现异常。

2 个答案:

答案 0 :(得分:2)

选项1:在界面中输入默认值。为此,您可能需要将常量提取到另一个类中,该类可以从IMyFormatterDefaultFormatter进行访问(因为接口上不能定义常量):

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