从基类继承重写方法

本文关键字:方法 重写 继承 基类 | 更新日期: 2023-09-27 18:26:40

想象一下你有abstract base class A,还有 继承自 A + 重写 A 命名foo()方法的abstract class B

此外,您还有从B继承的concrete class C

C具有重写的方法foo继承的。
现在考虑method foo正在使用反射并遍历类属性。

问题是:当C.foo()吃午饭时,反思是在C Class属性还是B class属性上进行?
我只需要在 C 级的属性上完成它。

从基类继承重写方法

请参阅BindingFlags.DeclaredOnly

public override void Foo() {
    PropertyInfo[] piAry = GetType().GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly);
}

让我们假设您的类 A 看起来与此类似。

abstract class A 
{
    public string PropertyA { get; set; }
    public abstract List<PropertyInfo> Foo();
}

现在,如果你的类 B 继承自这个类,并重写 Foo(( 方法,那么它可能看起来像下面的定义。

abstract class B : A
{
    public string PropertyB { get; set; }
    public override List<PropertyInfo> Foo()
    {
        return GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
                        .ToList();
    }
}

此外,您的最后一个类,即 C,这是唯一的具体类,将简单地定义如下。

class C : B
{
    public string PropertyC { get; set; }
}

为了测试此解决方案,并看到唯一返回的属性是 PropertyC,您需要运行以下代码行。

class Program
{
    static void Main()
    {
        new C().Foo().ForEach(x => Console.WriteLine(x.Name));
        Console.Read();
    }
}