在C#中,另一个子类的子类可以继承基类的方法吗?

3

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

问题是如果在A类中有一个方法,那么C类能否使用该方法?


这里有一个小例子,与大家的答案一起使用:http://ideone.com/E0xVzZ - Hunter McMillen
4个回答

2
是的,如果它被声明为“public”或“protected”,则可以访问,但不能是“private”。感谢@DavidL。我忘了提到“internal”的特殊情况。
来自Visual Studio附带的C#手册(此处为2012版):
•继承是可传递的。如果C派生自B,并且B派生自A,则C继承在B中声明的成员以及在A中声明的成员。•派生类扩展其直接基类。派生类可以向其继承的成员添加新成员,但不能删除继承成员的定义。•实例构造函数、析构函数和静态构造函数不会被继承,但所有其他成员都会被继承,无论其声明的可访问性如何(§3.5)。但是,根据其声明的可访问性,继承的成员可能在派生类中无法访问。•派生类可以通过声明具有相同名称或签名的新成员来隐藏(§3.7.1.2)继承的成员。但请注意,隐藏继承的成员不会删除该成员,而只是使该成员无法通过派生类直接访问。•类的实例包含在类及其基类中声明的所有实例字段集合,并且从派生类类型到其任何基类类型存在隐式转换(§6.1.6)。因此,对某个派生类的实例的引用可以被视为对任何其基类的实例的引用。•类可以声明虚方法、属性和索引器,派生类可以覆盖这些函数成员的实现。这使得类能够表现出多态行为,其中函数成员调用执行的操作取决于通过该函数成员调用的实例的运行时类型。
此外,这是C# 5.0中的新隐藏功能,如果我没错的话:
嵌套类型可以隐藏(§3.7.1)基本成员。嵌套类型声明上允许使用new修饰符,以便可以明确地表示隐藏。例如:
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。


不要忘记特殊情况,其中也适用于内部 :) - David L
1
方法隐藏在5.0中并不是新功能;它自1.0以来就一直存在,如果不是那时候,那么就是在2.0中。 - Servy

1

这要看情况。

  • 当类A中的方法是私有的时候:不行
  • 当类A中的方法是受保护的时候:可以
  • 当类A中的方法是公共的时候:可以
  • 当类A中的方法是公共或受保护的虚拟方法时,类C可以覆盖该方法。

2
值得注意的是,如果该方法是虚拟的,那么Class B可以通过将其标记为“sealed”来防止Class C覆盖该方法。 - itsme86

0
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
}

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接