覆盖初始化类

本文关键字:初始化 覆盖 | 更新日期: 2023-09-27 18:11:56

当我创建一个类时,我希望能够覆盖初始化类。但这似乎不起作用。甚至尝试使用: base()也无济于事。

public class Class1{
   public string Str1;
   public string Str2;
   public Class1(){ Str1 = "Hello"; }
   public Class1(string s) : base() <-------- Doesn't work
   {
        Str2 = "Goodbye";
   }
}

基本上,我想调用new Class1("test");,它应该用Hello填充Str1,用test填充Str2,而不必将第一个初始化项重写为第二个初始化项。

可以做些什么来实现这一点?

我可以将初始化方法分离成它自己的方法,并分别调用它们,但这似乎太冗余了…没有直接的方法吗?

覆盖初始化类

Replace

public Class1(string s) : base()

public Class1(string s) : this()

调用同一类的无参数构造函数。this() = Class1()


下面是一个带有继承的" base() -case"的例子

public class Class1
{
    public string Str1;
    public Class1() { Str1 = "Hello"; }
    public Class1(string s) { Str1 = s; }
}
public class Class2 : Class1
{
    public string Str2;
    public Class2() { Str2 = "World"; }
    public Class2(string s)  : base(s) // calls Class1(string s)
    {
        Str2 = s;
    }
}

用法:

Class2 c1 = new Class2("test"); // test test
Class2 c2 = new Class2(); //Hello World

不使用'base':

public Class1(string s) : base()
{...}

用"这":

public Class1(string s) : this()
{...}

或者,如果您的意图是始终为'Str1'分配一个静态值,那么通过直接将值分配给属性来节省调用第一个构造函数的麻烦:

public string Str1 = "Hello";

base将在您有基类时使用。this在同一个类中使用。

既然你在同一个类中调用构造函数,你应该使用this而不是base;

用一些例子补充上面的内容:

假设我们有一个基类,那么你可以像下面这样使用base关键字。注意:首先调用基类构造函数,然后调用子类构造函数

public class MainClass
{
    public string Str1;
    public MainClass(string s)
    {
        Str1 = s;
    }
}
public class Class1 : MainClass
{
    public string Str2;
    public Class1(string s) : base("Hello")
    {
        Str2 = "Goodbye";
    }
}

调用:var myClass = new Class1("GoodBye");


在相同的class:

public class Class1
{
    public string Str1;
    public string Str2;
    public Class1(string s)
    {
        Str2 = "Goodbye";
        Str1 = "Hello";
    }
}

或调用default constructor:

public class Class1
{
    public string Str1;
    public string Str2;
    public Class1()
    {
        Str1 = "Hello";
    }
    public Class1(string s): this()
    {
        Str2 = "Goodbye";
    }
}

注意: default constructor将在这里首先被调用

调用var class1 = new Class1("GoodBye");


另一种方法是使用Auto-Implemented属性,在前面提到的代码中,property被赋予一个默认值:
public class Class1
{
    public string Str1 { get; set; } = "Hello";
    public string Str2 { get; set; }
    public Class1(string s)
    {
        Str2 = "Goodbye";
    }
}