【问题标题】:C# accessing middle class members - not baseC# 访问中产阶级成员 - 不是基础
【发布时间】:2012-02-28 22:57:52
【问题描述】:

我的代码中有多个类继承结构。 D类继承自C类,C类继承自基类A的B类。它们每个都有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

我还需要处理该复杂名称的较短部分 - 还包括所有可能的变体:

  • GeneralFileName.Extension
  • PictureName-Dimension.Extension
  • GroupName-PictureName-Dimensions.Extension
  • GalleryName-GroupName-PictureName-Dimensions.Extension
  • GalleryName-GroupName-PictureName-Dimensions-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。有什么方法可以直接访问您派生的类,而不是基类?

【问题讨论】:

  • 你的结构应该是不可变的。

标签: c# inheritance multiple-inheritance


【解决方案1】:

您正在使用new。不要那样做。这完全摆脱了多态性,这肯定不是你想要的。根据我的经验,跟踪成员会使代码非常难以遵循 - 你为什么要这样做?

但是,如果您从派生自类 C 并公开 Foo 方法的类 D 调用 base.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

【讨论】:

    【解决方案2】:

    直接是你派生的类,而不是基类?

    base 已经指定了您派生的直接类。

    否则base 总是意味着System.Object(所有类之母)。

    【讨论】:

      【解决方案3】:

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

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

      但是,不可能调用被覆盖方法的祖父版本。

      【讨论】:

      • 谢谢。如果我覆盖它们怎么办?那么我将如何访问它们?
      • 你不能这样做,除非你给父类添加单独命名的方法。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        相关资源
        最近更新 更多