2011-10-04 37 views
-1

我父类的派生类的方法:为什么protected成员才可访问由

class clsTestParent 
    { 
     protected int x; 

     public void Foo() 
     { 
      x = 10; 
     } 

    } 

我有Derrived类,如下:

class clsDerivedTest : clsTestParent 
    { 

      x = 10; 
      Foo(); 

    } 

但是这是行不通的,因为我得到以下两个错误:

类,结构或接口成员声明中的令牌'='无效
方法必须返回类型

但是上述表述的正常工作,当我尝试在派生类中有一个方法来使用它们如下:

class clsDerivedTest : clsTestParent 
    { 


     public void myTestMethod() 
     { 
      x = 10; 
      Foo(); 
     } 
} 

为什么保护VAR或方法仅访问通过派生类方法但不直接在类中。

我甚至试图通过创建对象,如下访问受保护的成员:

clsDerivedTest objDerivedTest = new clsDerivedTest(); 
      objDerivedTest.x = 10; 

但是再次得到错误保护级别。我有var作为保护,所以为什么派生类的对象无法访问它?

我需要清除面向对象的基本原理,但卡在这里。

回答

2

你知道你的问题 - 我需要清除我的OOPS的基本面,但困在这里。

清除保护成员的概念:

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#语言规范,这将是很好的。它会让你的理解清楚。

1

你不能在c#中的类体中调用一个函数。

+1

我猜你的意思是不能? –

+0

该死的手机,是的:)谢谢。 – Tigran

+0

更正;-) ... –

5

那么,除了初始化,方法体是唯一可以执行代码的地方。您的陈述是应该放在方法体中的赋值表达式。

所以,这将在类级别工作:

int x = 10; 

,因为它是一个字段声明以及初始化器。但一个简单的赋值语句不起作用。你可以这样想:如果你把放在班级体内,每种方法之外,它会在什么时候运行?没有办法“援引”它。

如果您希望它在对象构造上运行,请为其创建方法或将其分配到类构造器中。

+0

你忘了提到这种方式基地领域被覆盖。 –

+0

@YvesM .:它被重写了什么?我并不是说要增加一个新的领域,我所建议的是,OP应该“为它创建一个方法,或者如果你想让它在对象构造上运行,就把你的任务放在类构造器中”。 – CesarGon

+0

如果你但是这个代码int x = 10;在派生类... –

1

“为什么受保护的var或方法只能使用派生类方法访问,但不能直接在类中访问。”你要做的是直接在类体中添加代码。这不起作用。现在有OO语言允许这样做。

要初始化x到10你可以使用类的构造函数...

class clsDerivedTest : clsTestParent  
{   
    public clsDerivedTest()   
    {    
     x = 10;    
    } 
} 
0

除了变量的一些声明外,一切都进入了方法体。调用方法进入方法体。 当您有多个类时,它们之间的通信通过使用方法发生。

相关问题