C# 隐藏派生类方法?

C# 隐藏派生类方法?,c#,inheritance,language-features,C#,Inheritance,Language Features,我们是否可以隐藏派生类public方法,使其在C#的Main()函数中不可访问。无法更改派生类方法的访问器 public class A { public void Add() { } } public class B : A { public void Multiply() { } } C中的In main()方法# 我们有什么办法可以这样做。这个请求没有任何意义。类B声明了一个方法Multiply。为

我们是否可以隐藏派生类public方法,使其在C#的Main()函数中不可访问。无法更改派生类方法的访问器

public class A
{
    public void Add()
    {
    }    
}       

public class B : A 
{
    public void Multiply()
    {
    }        
}
C中的In main()方法#


我们有什么办法可以这样做。

这个请求没有任何意义。类B声明了一个方法
Multiply
。为什么这个方法会被隐藏?对谁隐藏?

这个请求没有任何意义。类B声明了一个方法
Multiply
。为什么这个方法会被隐藏?对谁隐藏?

绝对不会。它是公共类的公共方法。如果你不能使用它,它就不应该公开


(顺便说一句,我看不出它源自
A
这个事实有什么关系。)

绝对没有关系。它是公共类的公共方法。如果你不能使用它,它就不应该公开


(顺便说一句,我看不出它从
A
派生出来的事实有什么关系。)

为什么不把这个方法私有化呢

public class B: A
{
  private void Multiply()
  {
  }
}
如果您绝对不能更改B,那么我唯一能想到的就是创建一个完整的适配器类

public C
{
  private B instance;

  private void Multiply(){}

  public void Add()
  {
    B.Add();
  }
}
这将迫使您“复制”B中除您想要的方法之外的所有方法


如果您确实需要将类设置为“B”,则必须使用reflector对其进行反向引擎,并将公共字段更改为私有或受保护。

为什么不将方法设置为私有

public class B: A
{
  private void Multiply()
  {
  }
}
如果您绝对不能更改B,那么我唯一能想到的就是创建一个完整的适配器类

public C
{
  private B instance;

  private void Multiply(){}

  public void Add()
  {
    B.Add();
  }
}
这将迫使您“复制”B中除您想要的方法之外的所有方法


如果您确实需要将类设置为“B”,则必须使用reflector对其进行反向引擎,并将公共字段更改为私有或受保护。

函数的公共点在于,它可以在其他地方访问


你可以私下继承吗?(没有意义)或将成员声明为私有或受保护,因此派生类不会继承它。

函数的公共性在于它可以在其他地方访问



你可以私下继承吗?(没有意义)或将成员声明为私有或受保护,因此派生类不会继承它。

我可以给你17%的答案。@Peterchen,以避免调用它。请参见--ToString from对象。没有办法摆脱它,它会导致错误。错误是坏的:-)@macias:about
ToString
-怎么会这样?你能详细说明一下吗?据我所知:最坏的情况下,它是一个基类遗留问题,您可能需要处理。幸运的是,没有太多的-ToString、GetHashCode和Equals。@彼得森,我更喜欢只以显式方式工作的真正的固体语言。隐式操作是不好的,因为它让代码溜进,这是我疲劳、半睡半醒等的结果。ToString作为对字符串的隐式转换,所以编译器很乐意编译语义不正确的代码。我一次又一次地被这个问题(隐式转换)困扰着。为了避免这个问题,在C++中引入了特殊的显式类,而在C语言中,它是语言的核心。最近我输入了var filename=directory+network.Signature()+“.xml”;你看到错误了吗?签名是一个包含复杂数据的类,像这样使用它毫无意义,但它编译时甚至没有警告。运行程序后我看到了什么?名为“Signature.xml”的文件。我没有时间犯这样的小错误,语言还没有真正成熟(以我们所有的经验),这让我很沮丧。我可以给你17%的答案。@Peterchen,为了避免打电话给它。请参见--ToString from对象。没有办法摆脱它,它会导致错误。错误是坏的:-)@macias:about
ToString
-怎么会这样?你能详细说明一下吗?据我所知:最坏的情况下,它是一个基类遗留问题,您可能需要处理。幸运的是,没有太多的-ToString、GetHashCode和Equals。@彼得森,我更喜欢只以显式方式工作的真正的固体语言。隐式操作是不好的,因为它让代码溜进,这是我疲劳、半睡半醒等的结果。ToString作为对字符串的隐式转换,所以编译器很乐意编译语义不正确的代码。我一次又一次地被这个问题(隐式转换)困扰着。为了避免这个问题,在C++中引入了特殊的显式类,而在C语言中,它是语言的核心。最近我输入了var filename=directory+network.Signature()+“.xml”;你看到错误了吗?签名是一个包含复杂数据的类,像这样使用它毫无意义,但它编译时甚至没有警告。运行程序后我看到了什么?名为“Signature.xml”的文件。我没有时间犯这样的小错误,令人沮丧的是,语言还没有真正成熟(以我们所有的经验)。我们不能改变公共访问者,有人在采访中问了这个问题:-我也这么说,但他不同意,因为这行不通。如果您重写它,它不能是私有的,如果您将它定义为新的,它将被忽略(即,将调用继承的版本)。@macias:没有进行重写。查看方法名称:Add和Multiply。见鬼,它们都没有被指定为虚拟的。我唯一不能想到的是在B上有一个完整的适配器,然后只使用C作为与B的接口。@Jon,我错过了这里缺少的虚拟,而且。。。哇3行距离,我看到的只是“数学”:-DWe不能改变公众访问者,有人在采访中问了这个问题-我也这么说,但他不同意,因为这行不通。如果您重写它,它不能是私有的,如果您将它定义为新的,它将被忽略(即,将调用继承的版本)。@macias:没有进行重写。查看方法名称:Add和Multiply。见鬼,它们都没有被指定为虚拟的。我唯一不能想到的是在B上有一个完整的适配器,然后只使用C作为与B的接口。@Jon,我错过了这里缺少的虚拟,