Почему C # принимает значение из переопределенного свойства вместо переопределяющего свойства? - PullRequest
4 голосов
/ 09 июня 2009

Я подозреваю, что приведенный ниже код выведет:

(Я объект SmartForm и использую метод в SmartForm) .xml

вместо этого выводит:

(я объект SmartForm и использую метод из Item) .xml

Почему это? Как заставить C # получить значение из свойства overriding ? Именно поэтому я overriding свойства.

using System;

namespace TestInhersdk234
{
    public class Program
    {
        static void Main(string[] args)
        {
            SmartForm smartForm = new SmartForm();
            Console.ReadLine();
        }
    }

    public class SmartForm : Item
    {
        public SmartForm()
        {
            Console.WriteLine(FullXmlDataStorePathAndFileName);
        }

        public new string GetItemTypeIdCode
        {
            get
            {
                return String.Format("(I am a {0} object and using the method in SmartForm)", this.GetType().Name);
            }
        }
    }

    public class Item
    {
        public string FullXmlDataStorePathAndFileName
        {
            get
            {
                return GetItemTypeIdCode + ".xml";
            }
        }

        public string GetItemTypeIdCode
        {
            get
            {
                return String.Format("(I am a {0} object and using the method in Item)", this.GetType().Name);
            }
        }
    }
}

Ответы [ 5 ]

13 голосов
/ 09 июня 2009

Вы на самом деле не переопределены. Ты прячешься. Для переопределения:

class MyBase
{
    public virtual void foo() {}
}

class MyClass : MyBase
{
    public override void foo() {}
}
6 голосов
/ 09 июня 2009

Вам необходимо добавить ключевое слово override в метод переопределения?

3 голосов
/ 09 июня 2009

Свойства элемента, которые вы хотите переопределить, не отмечены virtual. В результате, когда вы переопределяете их в SmartForm, вы просто «скрываете» их, а не переопределяете их. (Кроме того, вам потребуется ключевое слово override в SmartForm.)

Проверьте это руководство .

0 голосов
/ 09 июня 2009

свойство в базовом классе должно быть помечено как виртуальное

также свойство в унаследованном классе должно быть помечено переопределением

также я не уверен, почему ключевое слово new появляется в вашем коде в определении свойства

0 голосов
/ 09 июня 2009

GetItemTypeIdCode не является виртуальным; Вы не перекрываете это, вы просто скрываете это. В этом случае метод выполняется не на основе динамического типа объекта, а на статическом типе ссылки на объект. Внутри FullXmlDataStorePathAndFileName статический тип 'this' - это Item, а не SmartForm, поэтому вызывается реализация Item GetItemTypeIdCode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...