另一个子类的子类可以从 C# 中的基类继承方法
本文关键字:子类 基类 继承 方法 另一个 | 更新日期: 2023-09-27 17:56:05
假设类A是基类,然后你有A的B类子类(类B:A)。 然后你有类 C:B。
问题是,如果您在A类中有一个方法,C类可以使用该方法吗?
是的,你可以,如果它被声明为public
或protected
. 但不是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
}