2016-10-06 2 views
-2

Когда я создаю класс, я хочу иметь возможность переопределить класс initialize. Но, похоже, это не работает. Даже пробовал использовать : 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"); и он должен заполнить Str1 с Hello и Str2 с test, без необходимости переписывать код Int он первый Initializer ко второму.

Что можно сделать для достижения этого?

Я могу разделить метод инициализатора на свой собственный метод и называть его отдельно, но он просто кажется слишком избыточным ... Не существует ли прямой способ сделать это?

ответ

5

Заменить

public Class1(string s) : base() 

с

public Class1(string s) : this() 

вызвать конструктор без параметров одного и того же класса. this() = Class1()


Вот пример для "base() -случая" с наследованием

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 
1

base будет использоваться, когда у вас есть базовый класс , this для использования в одном классе.

Поскольку вы вызываете конструктор в том же классе, вы должны использовать this вместо base;

дополняющий выше с некоторыми примерами:

Скажем, у нас есть базовый класс, то вы могли бы использовать 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"; 
    } 
} 
1

Вместо того, чтобы использовать «базу»:

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

Используйте «это»:

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

Или, если ваше намерение состоит в том, чтобы всегда назначить статическое значение для «Str1» сохранить себя неприятности Призывая первый конструктор, просто присваивая значение непосредственно свойству:

public string Str1 = "Hello"; 
Смежные вопросы