наследование имущества - PullRequest
       11

наследование имущества

0 голосов
/ 23 декабря 2009
Public class ClassB : ClassA
{
}

public class GeneralClass
{
   public ClassA test
   {
      get{}
      set{}
   }
}
public class specificClass :GeneralClass
{
   public ClassB test
   {
      get{}
      set{}
   }
}

Как видите, тест свойства наследуется в specificClass от generalClass, но здесь я хочу изменить тип на ClassB (ClassB:ClassA). могу ли я сделать что-то подобное, так что в любое время я использую specializedClass.test, мне не нужно типизировать его в classB?

edit 1: Я забыл упомянуть, что теперь я получаю предупреждение, что test скрыть наследуемый член test .use новое ключевое слово, если скрытие предназначено.

Ответы [ 4 ]

6 голосов
/ 23 декабря 2009

Нельзя изменить тип возвращаемого значения, поскольку вы переопределяете методы и свойства. C # не поддерживает тип возвращаемой ковариации .

Кстати, если вам не нужно переопределять свойство и просто хотите вернуть базовое значение, приведенное к какому-либо конкретному типу, вы можете объявить свойство new чтобы скрыть базовый класс один. Обратите внимание, что это не возвращаемая ковариация типа. Это просто отдельное свойство, которое имеет одинаковое имя:

public new ClassB test {
     get { return base.test as ClassB; }
     set { base.test = value; }
} 
0 голосов
/ 23 декабря 2009

В зависимости от вашей конкретной задачи вы можете решить ее с помощью дженериков. (Но это довольно сложно)

Примечание: GeneralClass : AbstractGeneralClass и SpecificClass : AbstractGeneralClass

Вы можете:

  • хранить экземпляры GeneralClass и SpecificClass в AbstractGeneralClass
  • доступ testAsClassA, если у вас есть переменная типа AbstractGeneralClass
  • доступ ClassB test, если у вас есть переменная типа SpecificClass
 class ClassA { }
    class ClassB : ClassA { }

    abstract class AbstractGeneralClass
    {
        /* functionality that does not depend on test */

        public abstract ClassA testAsClassA { get; }
    }

    abstract class AbstractGeneralClass : AbstractGeneralClass where T : ClassA
    {
        T myProperty;
        public T test
        {
            get { return myProperty; }
            set { myProperty = value; }
        }

        public override ClassA testAsClassA { get { return myProperty; } }
    }

    class GeneralClass : AbstractGeneralClass { }

    class SpecificClass : AbstractGeneralClass { }
0 голосов
/ 23 декабря 2009

Mehrdad Afshari только что обновил свой вопрос, чтобы отразить то, что я собирался написать. По сути, вы ищете:

    public class ClassA
    {

    }

    public class ClassB : ClassA
    {

    }

    public class GeneralClass
    {
        public ClassA myClass { get; set; }
    }

    public class SpecificClass : GeneralClass
    {
        new public ClassB myClass { get; set; }
    }

    public myFunction()
    {

        var sc = new SpecificClass();

        sc.myClass = new ClassB();

        Console.WriteLine("sc.GetType() = " + sc.myClass.GetType());

        var gc = (GeneralClass)sc;

        gc.myClass = new ClassA();

        Console.WriteLine("gc.GetType() = " + gc.myClass.GetType());

        Console.WriteLine("sc.GetType() = " + sc.myClass.GetType());
    }
0 голосов
/ 23 декабря 2009

При переопределении методов и свойств вы должны использовать те же типы, что и базовый метод / свойство, даже если использование подкласса может быть безопасным. Вы можете скрыть свойства, используя ключевое слово new, но оно не будет фактически отправлено при вызове в базовом классе.

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