C# 类构造函数错误
因为我们知道构造函数不是像我在上一个问题中所问的那样在子类中继承的 我必须写代码C# 类构造函数错误,c#,asp.net,C#,Asp.net,因为我们知道构造函数不是像我在上一个问题中所问的那样在子类中继承的 我必须写代码 namespace TestConscoleApplication { abstract public class A { public int c; public int d; private A(int a, int b) { c = a; d = b; } publ
namespace TestConscoleApplication
{
abstract public class A
{
public int c;
public int d;
private A(int a, int b)
{
c = a;
d = b;
}
public virtual void Display1()
{
Console.WriteLine("{0}{1}", c, d);
}
}
internal class B : A
{
protected string Msg;
public B(string Err)
{
Msg = Err;
}
public void Display()
{
Console.WriteLine(Msg);
}
}
class Program
{
static void Main(string[] args)
{
B ObjB = new B("Hello");
Console.ReadLine();
}
}
}
当我编译代码时,它显示了一个错误
错误TestConscoleApplication.A.A(int,int)
由于其保护级别而不可访问
那么为什么它会显示错误。通过将
A的唯一构造函数设置为私有,您已经阻止了派生类能够在A
之外构造 通过将A
的唯一构造函数设为私有,可以防止派生类在A
之外构造 派生类构造函数始终调用基构造函数(其中一个)。如果将其设置为私有,则禁止从外部访问。换句话说,你不可能在A之外创建一个实例
由于您创建了构造函数,编译器不会为您生成该类的默认公共构造函数
如果希望提供从类子代而不是从外部对其的访问,则应使其受保护派生类构造函数始终调用基构造函数(其中一个)。如果将其设置为私有,则禁止从外部访问。换句话说,你不可能在A之外创建一个实例
由于您创建了构造函数,编译器不会为您生成该类的默认公共构造函数
如果您希望提供从类子代而不是从外部对其的访问,则应使其受保护构造函数不应是私有的,否则您将无法创建该类的实例,也无法继承它,但是如果你想创建一个私有构造函数,也可以创建一个公共构造函数。
更多信息构造函数不应该是私有的,否则您将无法创建该类的实例,也无法继承该类,但如果您想创建私有构造函数,也可以使用它创建公共构造函数。
要了解更多信息,您需要有一个a
的构造函数,可以访问B
,并使用它。此外,默认的基本构造函数是base()
(即无参数构造函数),它在A
上不存在。这里有一种方法可以解决此问题(删除非必要位):
您需要有一个a
的构造函数,可以访问B
,并使用它。此外,默认的基本构造函数是base()
(即无参数构造函数),它在A
上不存在。这里有一种方法可以解决此问题(删除非必要位):
因为我们知道,当我们不想创建类的实例时,它们是私有构造函数的概念,还有一点是构造函数不能继承子类,那么为什么它会显示错误。因为简单的概念是私有成员在子类中继承,但它们在子类中不可访问,我不访问在子类中调用基类构造函数的or,因为我们知道它们是私有构造函数的概念,当不想创建类的实例时,还有一点是构造函数不能继承子类,那么为什么它会显示错误。简单的概念是私有成员在子类中继承,但它们在子类中是不可访问的,我也没有在子类中访问或调用基类的构造函数,因为我们知道它们是私有构造函数的概念,当我们不想创建类的实例时,还有一点是构造函数不能继承子类,那么为什么它会显示错误呢概念是私有成员在子类中继承,但在子类中不能访问它们,并且我不会访问子类中的基类或调用子类中基类的构造函数class@naval每当您使用new
关键字构造派生类时,它也会调用基类的构造函数。如果不指定基类构造函数(例如:base(1,2)
),它将尝试使用基类的默认构造函数(如果存在)。在您的例子中,基类没有默认构造函数,因为您显式声明了一个。而该构造函数恰好是私有的
,无法从B
访问。即使您将其公开
,您也会看到它会抱怨无效参数(它需要:base(x,y)
)。然后您同意构造函数在子类no中继承。构造函数不是继承的——调用派生类(B)的构造函数时,也会调用一个基类(A)构造函数。这与继承不同。如果构造函数被继承,这意味着如果A
有一个类似A(inta,intb)
的构造函数,那么b
将自动继承该构造函数,这样您就可以执行新的b(1,2)
——情况并非如此。如果你想做到这一点,你必须为B编写一个新的构造函数,比如B(inta,intb)
。因为我们知道,当不想创建类的实例时,他们是私有构造函数的概念,还有一点是构造函数不能继承子类,那么为什么它会显示错误。简单的概念是私有成员在子类中继承,但在子类中无法访问,而我不是访问或调用子类中基类的构造函数class@naval每当您使用new
关键字构造派生类时,它也会调用基类的构造函数。如果不指定基类构造函数(例如:base(1,2)
),它将尝试使用基类的默认构造函数(如果存在)。在您的情况下,基类没有默认构造函数,因为您显式地decl
abstract public class A
{
protected A(int a, int b)
{
}
}
internal class B : A
{
public B(int a, int b, string Err)
: base(a, b)
{
}
}