C# 重写父常量变量

C# 重写父常量变量,c#,inheritance,static,C#,Inheritance,Static,我试图重写一个类常量变量,但我的方法不起作用 有关以下代码: // The following line of code should output "DATE: 9/9/2014" // But it outputs: "DATE: 31/3/2015" CustomDateChecker.checkUsedByDate(); 在下面的班级;我如何覆盖变量按年份使用,按月份使用和按日期使用 public class DateChecker { public const uint

我试图重写一个类常量变量,但我的方法不起作用

有关以下代码:

// The following line of code should output "DATE: 9/9/2014"
// But it outputs: "DATE: 31/3/2015"
CustomDateChecker.checkUsedByDate(); 
在下面的班级;我如何覆盖变量
按年份使用
按月份使用
按日期使用

public class DateChecker
{
    public const uint                   USED_BY_YEAR            = 2015;
    public const uint                   USED_BY_MONTH           = 3;
    public const uint                   USED_BY_DAY             = 31;

    public static bool checkUsedByDate()
    {
        TaskDialog.MessageBox.Show(string.Format("DATE: {0}/{1}/{2}", USED_BY_DAY, USED_BY_MONTH, USED_BY_YEAR));
    }
}

public class CustomDateChecker : DateChecker
{
    // Override Date
    public const uint                   USED_BY_YEAR            = 2014;
    public const uint                   USED_BY_MONTH           = 9;
    public const uint                   USED_BY_DAY             = 9;
}
编辑:阅读建议后,我将变量更改为
静态只读
,而不是
常量
。但不幸的是,这是同一个问题,日期没有改变。使用
静态只读
是一种可能的解决方案吗

public class DateChecker
{
    public static readonly uint                   USED_BY_YEAR            = 2015;
    public static readonly uint                   USED_BY_MONTH           = 3;
    public static readonly uint                   USED_BY_DAY             = 31;

    public static bool checkUsedByDate()
    {
        TaskDialog.MessageBox.Show(string.Format("DATE: {0}/{1}/{2}", USED_BY_DAY, USED_BY_MONTH, USED_BY_YEAR));
    }
}

public class CustomDateChecker : DateChecker
{
    // Override Date
    public static new readonly uint                   USED_BY_YEAR            = 2014;
    public static new readonly uint                   USED_BY_MONTH           = 9;
    public static new readonly uint                   USED_BY_DAY             = 9;
}
  • 您正试图覆盖字段或成员。重写是与方法/属性关联的功能,而不是与类的字段或成员关联的功能
  • 这里的另一个问题是,您试图使用静态方法来获得多态行为,但这不会成功。静态方法与类关联,而不是与类的实例关联。因此,静态方法不能与虚拟/重写限定符一起使用。为此,应该使用实例方法/非静态方法或属性
  • 看看下面的例子是否有用

            public class DateChecker
            {
                public virtual uint USED_BY_YEAR { get; set; }
                public virtual uint USED_BY_MONTH { get; set; }
                public virtual uint USED_BY_DAY { get; set; }
                public DateChecker()
                {
                    USED_BY_YEAR = 2015;
                    USED_BY_MONTH = 3;
                    USED_BY_DAY = 31;
    
                }
                public virtual void checkUsedByDate()
                {
                    Console.Write(string.Format("DATE: {0}/{1}/{2}", USED_BY_DAY, USED_BY_MONTH, USED_BY_YEAR));
                }
            }
    
         public class CustomDateChecker : DateChecker
        {
            public override uint USED_BY_DAY
            {
                get
                {
                    return 9;
                }
                set
                {
                    base.USED_BY_DAY = value;
                }
            }
    
            public override uint USED_BY_MONTH
            {
                get
                {
                    return 9;
                }
                set
                {
                    base.USED_BY_MONTH = value;
                }
            }
    
            public override uint USED_BY_YEAR
            {
                get
                {
                    return 2014;
                }
                set
                {
                    base.USED_BY_YEAR = value;
                }
            }        
        }
        class Program
        {        
            static void Main(string[] args)
            {
                new CustomDateChecker().checkUsedByDate();
            }
        }
    

  • 你不能覆盖它们。它们是
    const
    。如果它们是静态的,您也无法覆盖它们。只有虚拟实例成员可以被覆盖。@MarcinJuraszek不能使用
    new
    关键字覆盖静态成员吗?可以使用
    new
    关键字隐藏它们,这与覆盖它们不同<基类中的code>checkUsedByDate()方法仍将使用该类中的值。
            public class DateChecker
            {
                public virtual uint USED_BY_YEAR { get; set; }
                public virtual uint USED_BY_MONTH { get; set; }
                public virtual uint USED_BY_DAY { get; set; }
                public DateChecker()
                {
                    USED_BY_YEAR = 2015;
                    USED_BY_MONTH = 3;
                    USED_BY_DAY = 31;
    
                }
                public virtual void checkUsedByDate()
                {
                    Console.Write(string.Format("DATE: {0}/{1}/{2}", USED_BY_DAY, USED_BY_MONTH, USED_BY_YEAR));
                }
            }
    
         public class CustomDateChecker : DateChecker
        {
            public override uint USED_BY_DAY
            {
                get
                {
                    return 9;
                }
                set
                {
                    base.USED_BY_DAY = value;
                }
            }
    
            public override uint USED_BY_MONTH
            {
                get
                {
                    return 9;
                }
                set
                {
                    base.USED_BY_MONTH = value;
                }
            }
    
            public override uint USED_BY_YEAR
            {
                get
                {
                    return 2014;
                }
                set
                {
                    base.USED_BY_YEAR = value;
                }
            }        
        }
        class Program
        {        
            static void Main(string[] args)
            {
                new CustomDateChecker().checkUsedByDate();
            }
        }