从基类调用静态函数

Posted

技术标签:

【中文标题】从基类调用静态函数【英文标题】:Calling static function from base class 【发布时间】:2015-07-29 16:00:57 【问题描述】:

我有一个班级员工,其中我有一个静态函数,其中包含员工人数和员工类型(例如老师、助理老师、个人助理等)。为此,我在里面有一个静态班级,我有一个员工人数的静态计数以及我要访问基类静态方法的每个子类内部。

class Employee
    private static int emp;
    //...code

    static void IncreaseEmployeeCount()
    
        emp=emp+1;
    



class Teacher : Employee
    private static int tchr;

    //...code

    static void IncreaseTeacherCount()
    
        tchr = tchr + 1;
    

如何使用子类访问基类静态方法。它尝试使用以下但因编译时错误而失败:

Teacher teacher = new Teacher();
teacher.IncreaseEmployeeCount();

'Employee.IncreaseEmployeeCount()' 由于其保护级别而无法访问

添加public访问级别仍然报错:

无法使用实例引用访问成员“Employee.IncreaseEmployeeCount()”;改为使用类型名称来限定它

【问题讨论】:

你为什么要在这个问题中添加c++标签? 你应该试试 super.employeeCount() 而不是 tch。 tch 是一个实例,而不是它自己的类。 employeeCount() 是类级别的函数,而不是实例级别的函数。 @AlexeiLevenkov:除了从每个静态函数返回一个值之外,代码是可以接受的 C#。 @PaulF 我对所有小写字母感到困惑...确实是这样-我已经更新了示例以匹配默认的 C# 准则并且更易于编译-应该是一个更好的问题(我也不能再关闭它了) 【参考方案1】:

应该是Employee.IncreaseEmployeeCount()Teacher.IncreaseTeacherCount()。请记住,这些是静态方法,因此它们不会绑定到实例。你只需通过ClassName.StaticMethod()给他们打电话

【讨论】:

【参考方案2】:

作为静态方法,您不能通过类的实例访问它。你这样做

Teacher.IncreaseEmployeeCount();

注意原始样本有其他编译错误:

基类的方法需要声明为public。 将返回值与方法体对齐,因为它被声明为int,应该是voidreturn something;

【讨论】:

这行不通。静态方法不被子类继承,它们特定于/绑定到类,而不是实例。因此,必须将其称为employee.employeeCount() 在 c# 中它们是继承的 - 试试看。您可能会收到 Resharper 警告“通过派生类型访问类型的静态成员”,但这是警告而不是编译器错误。 你说得对,它确实有效,我会给你。但是,这种行为只是编译器提供的一种快捷方式。语法糖。 teacher.employeeCount() 只会编译为 employee.employeeCount()。正如我所说,teacher 没有静态成员 employeeCount(),因为静态成员不是继承的。 通常不是最佳实践我同意 - 但 Win Forms 控件使用继承的静态属性和方法,从派生类而不是基类 Control 调用它们似乎很自然。

以上是关于从基类调用静态函数的主要内容,如果未能解决你的问题,请参考以下文章

从基类到派生类的静态转换后找不到成员函数

Typescript - 从基类中的静态方法实例化子类,使用 args 并引用其他静态方法

从基类构造函数调用纯虚函数

从基类调用派生类函数

如何从基类中的函数调用重载函数?

从基类调用派生类中的函数