C # доступ к членам среднего класса - не базовый - PullRequest
2 голосов
/ 29 февраля 2012

В моем коде есть структура наследования нескольких классов. Класс D наследует от класса C, который наследует от класса B, который наследует от базового класса A. Каждый из них имеет метод TryParse.

Мой вопрос: есть ли какой-нибудь способ получить прямой доступ к классу, из которого вы производите, а не к базовому? Если я правильно использую код базы. TryParse в классе D вызовет A.TryParse. Как получить доступ к C.TryParse или B.TryParse из класса D?

Я буду более конкретным, описывая проблему, которую пытаюсь решить.

У меня есть имена файлов, которые состоят из многих вещей. В общем, это выглядит так:

GalleryName-GroupName-PictureName-Dimensions.jpg   // picture itself

Example: Domestic-Animals-Dogs-Catching-a-Frisbee-800x600.jpg
GalleryName: Domestic-Animals
GroupName: Dogs
PictureName: Catching-a-Frisbee
Dimensions: 800x600
Extension: jpg

and more variations:
GalleryName-GroupName-PictureName-Dimensions.htm  // related htm file
GalleryName-GroupName-PictureName-Dimensions-th.jpg // thumb - notice the -th

Мне нужно будет поработать и с более короткими частями этого сложного имени - также возможны все возможные варианты:

  • GeneralFileName.Extension
  • PictureName-Dimension.Extension
  • GroupName-PictureName-Dimensions.Extension
  • GalleryName-GroupName-PictureName-Dimensions.Extension
  • GalleryName-GroupName-PictureName-Размеры-th.Extension

Я хотел решить это следующим образом.

public struct PictureDimension
{
   public int Width;
   public int Height;

   public static bool TryParse( string parseString, out PictureDimension result ) 
   {
      // get it done 
   }
}

class FileNameWithExtension
{
   public string FileName { get; private set; }
   public string Extension { get; private set; }

   public bool TryParse( string parseString ) 
   {
      // extract filename from extension 
   }

}


class PictureDimensionExtensionName : FileNameWithExtension
{
        // inhereted from FileNameWithExtension
//        public string FileName { get; private set; }
//        public string Extension { get; private set; }
        public string PictureName { get; private set; }
        public PictureDimension Dimension { get; private set; }

   public new bool TryParse( string parseString ) 
   {
      base.TryParse( parseString );
      // get rest of it done
   }

   }
}

class GroupPictureDimensionExtensionName : PictureDimensionExtensionName
{
        // inhereted from PictureDimensionExtensionName
//        public string FileName { get; private set; }
//        public string Extension { get; private set; }
//        public string PictureName { get; private set; }
//        public PictureDimension Dimension { get; private set; }
        public string GroupName { get; private set; }

   public new bool TryParse( string parseString ) 
   {
    ==>   firstAboveBase.TryParse( string parseString );
      // get rest of it done 
   }
}

class GalleryGroupPictureDimensionExtensionName : 
           GroupPictureDimensionExtensionName
{
   public string GalleryName { get; private set; }

   public new bool TryParse( string parseString ) 
   {
    ==>   secondAboveBase.TryParse( string parseString );
      // get rest of it done 
   }
}

Мне не известны никакие ключевые слова, такие как firstAboveBase и secondAboveBase. Есть ли способ получить прямой доступ к классу, из которого вы производите, а не к базовому?

Ответы [ 4 ]

1 голос
/ 29 февраля 2012

непосредственно класс, из которого вы производите, а не базовый?

base уже обозначает непосредственный класс, из которого вы производите.

В противном случае base всегда будет означать System.Object (мать всех классов).

1 голос
/ 29 февраля 2012

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

Однако, если вы вызываете base.Foo из класса D, который происходит от класса C и который предоставляет метод Foo, он будет вызывать C.Foo.

Пример кода:

using System;

class A
{
    public virtual string Foo() { return "A"; }
}

class B : A
{
    public override string Foo() { return "B"; }
}

class C : B
{
    public override string Foo() { return "C"; }
}

class D : C
{
    public override string Foo() { return "D"; }

    public void ShowBaseFoo()
    {
        Console.WriteLine("base.Foo() from D: {0}", base.Foo());
    }
}

class Test
{
    static void Main()
    {
        new D().ShowBaseFoo();
    }
}

Выход:

base.Foo() from D: C
0 голосов
/ 29 февраля 2012

Можно ли просто выполнить приведение к нужному родительскому типу?

D myVar = New D();
((B)myVar).TryParse(...)
0 голосов
/ 29 февраля 2012

В вашем конкретном случае вы можете, поскольку вы не переопределяете их.

((FileNameWithExtension)this).TryParse(...);

Однако невозможно вызвать версию переопределенного метода для дедушки и дедушки.

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