2014-02-08 78 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