Как уже отмечалось, ключевое слово new
будет только скрывать значение, а не переопределять его.Чтобы сделать это, вам нужно использовать ключевое слово override
, которое нельзя использовать в полях, но можно использовать в свойствах, например:
public static Main(string[] args)
{
A test = new B();
Console.WriteLine(test.S); // Prints "B"
}
public class A
{
protected string s;
public virtual string S { get => "A"; set => s = value; }
}
public class B : A
{
public override string S { get => "B"; set => s = value; }
}
Это, вероятно, самое близкоето, что вы ожидали, но мы должны ввести поле поддержки, чтобы иметь возможность изменить значение S
.Если вы не планируете делать это, вы можете просто использовать public virtual string S => "A";
и сделать его доступным только для чтения.
Однако, это, вероятно, не предполагаемое использование переопределения свойств.Скорее всего, в функциях get
или set
есть что-то другое:
public class A
{
public virtual string S
{
// Do Something
}
}
public class B : A
{
public override string S
{
// Do something else
}
}
Поскольку все, что вы делаете, это изменение значений, то, вероятно, лучше сделать это вконструктор.
public class A
{
public string S { get; set; } = "A";
}
public class B : A
{
public B() => S = "B";
}
Недостатком использования конструктора является то, что если вы изменяете значение для всех дочерних классов, вы не сможете быстро определить, что это значение, не открывая конструктор, что может затруднить поиск.В общем, все сводится к личным предпочтениям того, какой подход вы используете.