我的代码中有多个类继承结构。 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每个可能的变体:
我想这样解决。
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。有没有办法直接访问你派生的类,而不是基础?
答案 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(...)