C# 为什么受保护的成员只能由派生类的方法访问
我有一个父类:C# 为什么受保护的成员只能由派生类的方法访问,c#,.net,oop,inheritance,derived-class,C#,.net,Oop,Inheritance,Derived Class,我有一个父类: class clsTestParent { protected int x; public void Foo() { x = 10; } } 我的得力课程如下: class clsDerivedTest : clsTestParent { x = 10; Foo(); } class clsDeriv
class clsTestParent
{
protected int x;
public void Foo()
{
x = 10;
}
}
我的得力课程如下:
class clsDerivedTest : clsTestParent
{
x = 10;
Foo();
}
class clsDerivedTest : clsTestParent
{
public void myTestMethod()
{
x = 10;
Foo();
}
}
clsDerivedTest objDerivedTest = new clsDerivedTest();
objDerivedTest.x = 10;
但这不起作用,因为我遇到以下两个错误:
类、结构或接口成员声明中的标记“=”无效方法必须具有返回类型 但当我尝试将上述语句与派生类中的方法一起使用时,它们的效果很好,如下所示:
class clsDerivedTest : clsTestParent
{
x = 10;
Foo();
}
class clsDerivedTest : clsTestParent
{
public void myTestMethod()
{
x = 10;
Foo();
}
}
clsDerivedTest objDerivedTest = new clsDerivedTest();
objDerivedTest.x = 10;
为什么受保护的var或方法只能通过使用派生类方法而不能直接在类中访问 我甚至尝试通过如下方式创建对象来访问受保护的成员:
class clsDerivedTest : clsTestParent
{
x = 10;
Foo();
}
class clsDerivedTest : clsTestParent
{
public void myTestMethod()
{
x = 10;
Foo();
}
}
clsDerivedTest objDerivedTest = new clsDerivedTest();
objDerivedTest.x = 10;
但再次得到保护级别的错误。我将var作为受保护的对象,所以为什么派生类的对象不能访问它
我需要清除OOPs的基础知识,但仍停留在这里。在c#中不能在类体中调用函数。好吧,除了初始化器之外,方法体是唯一可以执行代码的地方。你的陈述
x=10
是一个赋值表达式,应该放在方法体中
因此,这将在班级层面起作用:
int x = 10;
因为它是一个字段声明加上初始化器。但简单的赋值语句不起作用。这样想:如果你把x=10代码>在你的课堂身体的中间,在每种方法之外,它什么时候运行?没有办法“调用”它
如果要在对象构造上运行,请为其创建一个方法或将赋值放在类构造函数中。“为什么受保护的变量或方法只能通过使用派生类方法访问,而不能直接在类中访问。”您要做的是直接在类体中添加代码。这是行不通的。现在有一种OO语言允许这样做
要将x初始化为10,可以使用类的构造函数
class clsDerivedTest : clsTestParent
{
public clsDerivedTest()
{
x = 10;
}
}
你知道你的问题-
我需要弄清楚OOPs的基本原理,但还是停留在这里
明确受保护成员的概念:
受保护关键字是成员访问修饰符。受保护成员可以从声明该成员的类内以及从声明该成员的类派生的任何类内访问
class A
{
protected int x = 123;
}
class B : A
{
void F()
{
A a = new A();
B b = new B();
a.x = 10; // Error
b.x = 10; // OK
}
}
此外,如果您通过C语言规范,这将是一件好事。这将使您的理解更加清晰。除了一些变量声明之外,所有内容都进入方法体。调用方法进入方法体。
当您有多个类时,它们之间的通信是通过使用方法进行的。您忘记了用这种方式重写基字段。@YvesM:它是用什么方式重写的?我不是建议增加一个新领域;我的建议是OP应该“为它创建一个方法,或者如果你想让它在对象构造上运行,就把赋值放在类构造函数中”;在派生类中…@YvesM.:但这不是我在回答中所说的。