C# 隐藏继承类的构造函数
请看一看这个例子:C# 隐藏继承类的构造函数,c#,oop,inheritance,C#,Oop,Inheritance,请看一看这个例子: public class X { public X() { MessageBox.Show("I'm X"); } } public class Y : X { public Y() { MessageBox.Show("I'm Y"); } } 执行命令时Y Y=newy(),出现两个消息框-首先是“我是X”,然后是“我是Y” 我怎样才能摆脱这种行为?在创建新的Y时,我需要停止X的构造函数,
public class X
{
public X()
{
MessageBox.Show("I'm X");
}
}
public class Y : X
{
public Y()
{
MessageBox.Show("I'm Y");
}
}
执行命令时Y Y=newy()代码>,出现两个消息框-首先是“我是X”,然后是“我是Y”
我怎样才能摆脱这种行为?在创建新的Y
时,我需要停止X的构造函数,除非您特别调用另一个构造函数,否则将调用X的默认构造函数。
试试这个:
public class X {
public X() {
MessageBox.Show("I'm X");
}
protected X(int dummy){
}
}
public class Y : X {
public Y() : X(0) { // will call other constructor
MessageBox.Show("I'm Y");
}
}
这只会阻止调用默认构造函数
但是,基于您的问题——“我需要的是在创建新的Y时停止X的构造函数。”我不确定您是否了解对象继承的基本知识。。。如果在创建新Y时不想创建新X,为什么要从X派生Y?你知道继承是一种关系,对吧?在您的例子中,Y是X…将调用X中的默认构造函数,除非您专门调用另一个构造函数。
试试这个:
public class X {
public X() {
MessageBox.Show("I'm X");
}
protected X(int dummy){
}
}
public class Y : X {
public Y() : X(0) { // will call other constructor
MessageBox.Show("I'm Y");
}
}
这只会阻止调用默认构造函数
但是,基于您的问题——“我需要的是在创建新的Y时停止X的构造函数。”我不确定您是否了解对象继承的基本知识。。。如果在创建新Y时不想创建新X,为什么要从X派生Y?你知道继承是一种关系,对吧?在您的情况下,Y是X…您可以使用工厂方法:
public class X {
private X() {}
protected virtual void Init(){
MessageBox.Show("I'm X");
}
public static GetX() {
X ret = new X();
ret.Init();
return ret;
}
}
public class Y : X {
private Y() {}
protected virtual void Init(){
MessageBox.Show("I'm Y");
}
public static GetY() {
Y ret = new Y();
ret.Init();
return ret;
}
}
您可以使用工厂方法:
public class X {
private X() {}
protected virtual void Init(){
MessageBox.Show("I'm X");
}
public static GetX() {
X ret = new X();
ret.Init();
return ret;
}
}
public class Y : X {
private Y() {}
protected virtual void Init(){
MessageBox.Show("I'm Y");
}
public static GetY() {
Y ret = new Y();
ret.Init();
return ret;
}
}
假设Y
是X
的一个子类型。更具体地说,Y
需要一个X
才能完成。因此,如果您构造一个Y
,它需要能够以某种方式创建一个X
。也就是说,您将需要始终调用构造函数,但哪一个由您决定。您可以通过Luchian回答中的策略指定哪一个:
public Y () : X (...)
根据参数选择X
的构造函数。考虑Y
是X
的子类型。更具体地说,Y
需要一个X
才能完成。因此,如果您构造一个Y
,它需要能够以某种方式创建一个X
。也就是说,您将需要始终调用构造函数,但哪一个由您决定。您可以通过Luchian回答中的策略指定哪一个:
public Y () : X (...)
其中,您可以根据参数选择X
的构造函数。这就可以了,尽管您可能应该避免在构造函数中执行任何操作。构造函数只能用于初始初始化
public class X
{
public X()
{
if (this.GetType() == typeof(X))
{
Console.WriteLine("I'm X");
}
}
public class Y : X
{
public Y()
{
Console.WriteLine("I'm Y");
}
}
class Program
{
static void Main(string[] args)
{
Y y = new Y();
}
}
}
这就可以了,尽管您可能应该避免在构造函数中执行任何操作。构造函数只能用于初始初始化
public class X
{
public X()
{
if (this.GetType() == typeof(X))
{
Console.WriteLine("I'm X");
}
}
public class Y : X
{
public Y()
{
Console.WriteLine("I'm Y");
}
}
class Program
{
static void Main(string[] args)
{
Y y = new Y();
}
}
}