我有父类:
class clsTestParent
{
protected int x;
public void Foo()
{
x = 10;
}
}
我的Derrived Class如下:
class clsDerivedTest : clsTestParent
{
x = 10;
Foo();
}
但这不起作用,因为我遇到了两个错误:
类,结构或接口成员声明中的无效标记'=' 方法必须具有返回类型
但是当我尝试将它们与派生类中的方法一起使用时,上述语句可以正常工作,如下所示:
class clsDerivedTest : clsTestParent
{
public void myTestMethod()
{
x = 10;
Foo();
}
}
为什么受保护的var或方法只能通过使用派生类方法访问,但不能在类中直接访问。
我甚至尝试通过创建对象来访问受保护的成员,如下所示:
clsDerivedTest objDerivedTest = new clsDerivedTest();
objDerivedTest.x = 10;
但是再次获得保护级别的错误。我有var作为保护,所以为什么派生类的对象不能访问它?
我需要清除我的OOP基础知识,但要坚持到这里。
答案 0 :(得分:5)
嗯,除了初始化者之外,方法体是唯一可以执行代码的地方。您的语句x = 10;
是一个赋值表达式,应该放在方法体中。
所以,这可以在班级一级工作:
int x = 10;
因为它是字段声明加上初始化程序。但是一个简单的赋值语句不起作用。可以这样想:如果你把x = 10;
放在你的班级中间,在每个方法之外,什么时候会运行?没有办法“调用”它。
为它创建一个方法,或者如果你希望它在对象构造上运行,可以将你的赋值放在类构造函数中。
答案 1 :(得分:2)
你知道你的问题 - 我需要清除我的OOP基础知识,但要坚持到这里。
明确受保护成员的概念:
protected关键字是成员访问修饰符。受保护的成员可以在声明它的类中访问,也可以从派生自声明该成员的类派生的任何类中访问。
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#语言规范将会很好。这将使你的理解清晰。
答案 2 :(得分:1)
你不能在c#中调用类体中的函数。
答案 3 :(得分:1)
“为什么受保护的var或方法只能通过使用派生类方法访问,但不能在类中直接访问。”您要做的是直接在类体中添加代码。这不起作用。现在有OO语言允许这样做。
要将x初始化为10,您可以使用类的构造函数...
class clsDerivedTest : clsTestParent
{
public clsDerivedTest()
{
x = 10;
}
}
答案 4 :(得分:0)
除了一些变量声明之外,所有内容都进入方法体。调用方法进入方法体。 如果您有多个类,则使用方法进行通信。