【问题标题】:What is the correct approach to make objects of internal classes "visible" to inheriting class [duplicate]使内部类的对象对继承类“可见”的正确方法是什么[重复]
【发布时间】:2017-08-23 05:44:48
【问题描述】:
internal class MyClassA
{
    [...properties...]
    public List<string> DoSomething(){}
}

// Different project/assembly, same solution:
public class MyBase
{
    protected MyClassA _myClassA = new MyClassA(); // Here is the problem

}

// What I want to do:
public class SomeOtherClass : MyBase
{
    private static void Foo(){
        var list = _myClassA.DoSomething();
    }
}

SomeOtherClass 继承自 MyBase。

MyBase 应创建 MyClassA 的实例,以使其可由 SomeOtherClass 访问(受保护)。

但由于 MyClassA 是内部的,所以这是不可能的。

我怎样才能使 SomeOtherClass 在使用 MyBase 中的实例时可以使用 MyClassA.DoSomething() 成为可能?

PS:我完全意识到“只是将可见性从 MyClassA 更改为 public”的可能性,但这不是一个选项。

【问题讨论】:

  • 我无法以任何方式修改 MyClassA 类。如果可以的话,我会改成公开的
  • 不需要修改 MyClassA ,该属性是在程序集级别应用的
  • 只需将 MyBase 类包含到包含 MyClassA 的程序集中。
  • 链接的副本不正确,这与标题中的描述相反,不是关于继承,而只是关于内部类,嗯......内部,以及如何处理这个问题。 @AlekseyL. 上面的评论是正确的。要使一个程序集中的内部类在另一个程序集中可用,您必须将 InternalsVisibleToAttribute 添加到带有类的程序集。

标签: c# oop inheritance


【解决方案1】:

您可以将 MyClassA 的可见性更改为受保护:

protected class MyClassA
{
    [...properties...]
    public List<string> DoSomething(){}
}

如果你“不能以任何方式修改 MyClassA 类”,那么你不能。

封装是 OOP 的基本原理,而 C# 主要是一种 OO 语言。

它不会让你违反你无权访问的类的封装。

【讨论】:

  • 在没有蚂蚁评论的情况下投票否决没有错误陈述的答案???上面的所有 cmets 以及引用的重复答案都针对“使内部类可见”问题的第一部分,而忽略了只想为“继承类”执行此操作的上下文。 'InternalsVisibleTo' 必须被抢先应用,并且不能应用于所有继承的类。如果 OP 说他不能修改类,为什么他能够修改比修改单个类更具侵入性的项目?
猜你喜欢
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2011-05-10
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多