gpt4 book ai didi

C# 访问中间类成员 - 不是基础

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:32 25 4
gpt4 key购买 nike

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

我的问题是有什么方法可以直接访问您派生的类,而不是基类?如果我是正确的代码 base.TryParse 在类 D 将调用 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 每个可能的变体:

  • 通用文件名.扩展名
  • 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。有什么方法可以直接访问您派生的类,而不是基类?

最佳答案

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

关于C# 访问中间类成员 - 不是基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9491118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com