【问题标题】:what is internal protection, and why does strange class work?什么是内部保护,为什么奇怪的类有效?
【发布时间】:2014-02-08 08:04:08
【问题描述】:

如果我将 BaseClass 公开,它就会开始抱怨:

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

首先我不明白为什么它抱怨 afaik 基类应该是你开始访问东西的地方

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");
    }
}

还是我只是做了一堆和 public 一样的东西?

但 ATM 最让我烦恼的是为什么它会起作用:

Class2 A = new BaseClass();

如果这不起作用

Class2 C = new Class2();

对不起,如果我对课程了解得太少,我在经过 1 年的编程后今天才开始学习这些课程。

【问题讨论】:

    标签: c# class unity3d abstract-class internal


    【解决方案1】:

    你把所有东西都命名得很糟糕……这让人很困惑。如果你让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();
    

    ..是因为您的代码中的Class2abstract。您根本无法实例化abstract 类的实例。它们可以继承自.. 没有实例化。

    可访问性不一致 错误是因为 internal 的可访问性低于 public。如果你的方法是internal.. 那么它在程序集之外是不可见的。

    【讨论】:

    • @user3276642 不,不会。重新阅读代码。 AbstractBase抽象的..你不能实例化它。
    • 是的,这就是为什么我在您发表评论之前删除了评论,...完全,...现在是上午 9:30,...
    • 我理解正确吗,基类是一切都没有结束的地方?
    • 我不太明白你的意思。我的建议是你修改你对 OO、抽象类、接口和多态的理解。
    【解决方案2】:

    以下是修饰符之间的一些基本区别:

    this would help you 受保护:

    类型或成员只能由同一类或结构中的代码或派生类中的代码访问。

    内部:

    同一程序集中的任何代码都可以访问类型或成员,但不能从另一个程序集中访问。

    受保护的内部:

    同一程序集中的任何代码或另一个程序集中的任何派生类都可以访问该类型或成员。

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

    【讨论】:

    • 什么是同一个程序集?
    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 2012-06-13
    • 2011-02-21
    • 1970-01-01
    • 2018-10-30
    • 2015-08-01
    • 2021-06-27
    • 2015-09-25
    相关资源
    最近更新 更多