另一个子类的子类可以从 C# 中的基类继承方法

本文关键字:子类 基类 继承 方法 另一个 | 更新日期: 2023-09-27 17:56:05

假设类A是基类,然后你有A的B类子类(类B:A)。 然后你有类 C:B。

问题是,如果您在A类中有一个方法,C类可以使用该方法吗?

另一个子类的子类可以从 C# 中的基类继承方法

是的,你可以,如果它被声明为publicprotected. 但不是private.

感谢@DavidL..我忘了提到internal的特殊情况.

来自Visual Studio附带的C#手册(此处为2012版):

  • • 继承是可传递的。如果 C 派生自 B,B 派生自从 A 继承,然后 C 继承 B 中声明的成员以及在 A 中声明的成员。 • 派生类扩展其直接基.class。派生类可以向其继承的成员添加新成员,但是它不能删除继承成员的定义。•实例构造函数、析构函数和静态构造函数不继承,但所有其他成员都是,无论他们声明的可访问性如何(§3.5)。但是,根据其声明的可访问性,继承了成员可能无法在派生类中访问。 • 派生类可以通过声明新成员来隐藏 (§3.7.1.2) 继承的成员相同的名称或签名。但请注意,隐藏继承的成员不会删除该成员,它只是使该成员无法直接通过派生类访问。 • 一个实例类包含类中声明的所有实例字段的集合,并且它的基类,并且隐式转换 (§6.1.6) 存在于派生类类型为其任何基类类型。因此,参考对某个派生类的实例可以被视为对其任何基类的实例。• 类可以声明虚拟方法、属性和索引器以及派生类可以重写这些函数成员的实现。这使类能够表现出多态行为,其中由函数成员调用因运行时类型通过其调用该函数成员的实例。

如果我是对的,这也是 C# 5.0 中一个新的隐藏功能:

嵌套类型可以隐藏 (§3.7.1) 基成员。允许在嵌套类型声明上使用新修饰符,以便可以显式表示隐藏。示例

using System;
class Base
{
    public static void M() {
        Console.WriteLine("Base.M");
    }
}
class Derived: Base 
{
    new public class M 
    {
        public static void F() {
            Console.WriteLine("Derived.M.F");
        }
    }
}
class Test 
{
    static void Main() {
        Derived.M.F();
    }
}

显示一个嵌套类 M,该类隐藏了 Base 中定义的方法 M。

这取决于。

  • 当类 A 中的方法为私有方法时:否
  • 当类 A 中的方法受到保护时:是
  • 当类 A 中的方法为公共时:是
  • 当类 A 中的方法为公共或受保护且虚拟时,类 C 可以重写该方法。

是的,当你从一个类继承时,你会得到它的所有方法,包括它从其他类继承的所有方法。

public class A
{
    public int Id { get; set; }
    protected int protectedId { get; set; }
    private int privateId;
}
public class B : A
{
}
public class C : B
{
    public C()
    {
        int temp = Id; // works
        int temp1 = protectedId; // works
        int temp2 = privateId; // does NOT work
    }
}

和其他一些班级;

public void SomeMethod()
{
    C c = new C();
    int i = c.Id; // works
    int j = c.protectedId; // does NOT work
    int k = c.privateId; // does NOT work
}