2014-02-08 86 views
0

如果我让BaseClass的公共它开始抱怨:什么是内部保护,为什么奇怪的班级工作?

Assets/TestScript.cs(14,14): error CS0060: Inconsistent accessibility: base class `Class1' is less accessible than class `BaseClass' 

首先,我不明白为什么会抱怨因为据我所知基类应该是从你开始访问的东西

B无法访问受保护的一个功能女巫很好。

但是什么是内部类?

using UnityEngine; 
using System.Collections; 

public class TestScript : MonoBehaviour { 
    BaseClass B = new BaseClass(); 
    Class2 A = new BaseClass(); // how can this even work and why does it work? 
Class2 C = new Class2(); // Assets/TestScript.cs(7,28): error CS0144: Cannot create an instance of the abstract class or interface `Class2' // - WTH why? 
    void Start(){ 
     B.BaseFunction(); // Base 
     B.Function1(); // Assets/TestScript.cs(10,19): error CS0122: `Class1.Function1()' is inaccessible due to its protection level 
     A.Function2(); // 2 
    } 
} 

internal class BaseClass : Class1 { 
    internal void BaseFunction(){ 
     Debug.Log("Base"); 
    } 
} 
internal abstract class Class1 : Class2{ 
    protected void Function1(){ 
     Debug.Log("1"); 
    } 
} 
public abstract class Class2{ 
    public void Function2(){ 
     Debug.Log("2"); 
    } 
} 

还是我做了一堆与公共相同的东西呢?

但ATM我什么bugges最多的是为什么会发生这种工作:

Class2 A = new BaseClass(); 

如果这不,如果我太少博学约我刚开始上课上班

Class2 C = new Class2(); 

对不起在编程一年后今天就学习它们。

回答

0

这里是改性剂之间有一些基本的区别:,或在派生类

的类型或成员只能由在同一类或结构代码来访问:

this would help you 保护。

内部:

类型或构件可以通过在相同的组件中的任何代码进行访问,但不能从另一个组件。

保护的内部:

的类型或成员可以通过任何代码在相同的组件来访问,或通过在另一组件中的任何派生类。

受保护的内部;只有相同程序集中的派生类型或类型才能访问该成员,因此它们需要位于同一个动态链接库或可执行文件中。

+0

什么是相同的程序集? – MilitaryG

3

你的所有命名都非常糟糕......它让人困惑。如果您BaseClass实际上是一个基类..那么它应该能理解:

public abstract class AbstractBase { 
    public void BaseFunction(){ 
     Debug.Log("2"); 
    } 
} 

public class Class1 : AbstractBase { 
    public void ClassOneFunction(){ 
     Debug.Log("Base"); 
    } 
} 
public abstract class Class2 : Class1 { 
    public void ClassTwoFunction(){ 
     Debug.Log("1"); 
    } 
} 

现在,如果我们重新工作,你的问题,你会得到这样的事情:

AbstractBase A = new Class1(); 

你代表Class1的实例为AbstractBase,这是完全正常的。您可以替换从AbstractBase继承的任何东西来代替AbstractBase声明。这是多态性在工作。

这里要记住的关键是,当您将Class1的实例表示为AbstractBase时,它仅作为AbstractBase“可见”。因此,鉴于上面的代码..这是行不通的:

AbstractBase A = new Class1(); 
A.ClassOneFunction(); // won't work because Function2 is a function of Class1 

不工作的一个:

Class2 C = new Class2(); 

..是因为Class2在你的代码是abstract。你根本不能实例化abstract类的实例。他们在那里是从..没有实例化继承。

不一致的可访问性错误是因为internalpublic更难以访问。如果你的方法是internal ..那么它是不可见的大会之外。

+0

@ user3276642不,它不会。重新阅读代码。 'AbstractBase'是_abstract_ ..你不能实例化它。 –

+0

是的,我做到了,所以我在评论之前删除了评论,...我试图让自己的头靠近这台ATM机,但是我想我需要一个很大的睡眠,然后才能完全理解它,......它是9 :30 AM,... – MilitaryG

+0

我的理解是否正确,基类是哪里的一切都走到哪里没有结束的地方? – MilitaryG