C#访问中产阶级成员 - 而不是基础

时间:2012-02-28 22:57:53

标签: c# inheritance multiple-inheritance

我的代码中有多个类继承结构。 D类继承自继承自基类A的B类的C类。每个类都有TryParse方法。

我的问题是有没有办法直接访问你派生的课程,而不是基础? 如果我是正确的代码库,则D类中的TryParse将调用A.TryParse。 如何从D类访问C.TryParse或B.TryParse?

通过描述我想要解决的问题,我会更具体。

我的文件名由很多东西组成。 一般来说,它是这样的:

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

我还需要处理这个复杂名称的较短部分 - alsmot每个可能的变体:

  • GeneralFileName.Extension
  • PictureName-Dimension.Extension
  • 组名-PictureName-Dimensions.Extension
  • GalleryName-组名-PictureName-Dimensions.Extension
  • GalleryName-组名-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 个答案:

答案 0 :(得分:1)

您正在使用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

输出:

{{1}}

答案 1 :(得分:1)

  

直接从你派生的班级,而不是基础?

base已指定您派生的直接课程。

否则base总是意味着System.Object(所有班级的母亲)。

答案 2 :(得分:0)

在您的具体情况下,您可以,因为您没有覆盖它们。

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

但是,无法调用重写方法的祖父版本。

答案 3 :(得分:0)

是否可以对您需要的父类型进行强制转换?

D myVar = New D();
((B)myVar).TryParse(...)