C#接触中产阶级成员-而非基层

C#接触中产阶级成员-而非基层,c#,inheritance,multiple-inheritance,C#,Inheritance,Multiple Inheritance,我的代码中有多个类继承结构。类D继承自类C,类C继承自类B,类B继承自基类A。每个类都有TryParse方法 我的问题是,有没有办法直接访问您所派生的类,而不是base? 如果我正确,类D中的代码base.TryParse将调用A.TryParse。 如何从D类访问C.TryParse或B.TryParse 我将更具体地描述我试图解决的问题 我有由许多内容组成的文件名。 一般来说是这样的: GalleryName-GroupName-PictureName-Dimensions.jpg //

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

我的问题是,有没有办法直接访问您所派生的类,而不是base? 如果我正确,类D中的代码base.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
  • GroupName-PictureName-Dimensions.Extension
  • GalleryName-GroupName-PictureName-Dimensions.Extension
  • GalleryName-GroupName-PictureName-Dimensions-th.扩展名
我想这样解决它

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 
   }
}

我不知道像FirstOverbase和SecondOverbase这样的关键词。是否有任何方法可以直接访问派生自的类,而不是基本类?

在您的特定情况下,您可以,因为您没有重写它们

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

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

您使用的是
new
。不要那样做。这就完全消除了多态性,这肯定不是你想要的。根据我的经验,跟踪成员会使代码更难遵循-你为什么要这么做

但是,如果您从类
D
调用
base.Foo
,该类派生自类
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

是否可以对所需的父类型执行强制转换

D myVar = New D();
((B)myVar).TryParse(...)
直接从中派生的类,而不是基

base
已指定从中派生的直接类


否则
base
将始终意味着
System.Object
(所有类之母)。

您的结构应该是不可变的。谢谢。如果我正在覆盖它们呢?那么我如何访问它们呢?除非向父类添加单独命名的方法,否则您将无法访问它们。