Я пробовал и пытался, но я не уверен, как это сделать.C# абстрактное поле как свойство и как возврат от метода
Сегодня утром я играю с абстрактным классом. То, что я хотел бы сделать, это получить (только get
, забыли set
) whenused
поле Salutation
через класс GoodMorning
, но для доступа к нему как к собственности, а не к вызову метода.
Следующий код работает просто отлично. Но я бы использовал morn.whenUsed
в Main() вместо morn.whenUsed()
.
Если то же изменение необходимо оставить в GoodMorning
, GoodAfternoon
и GoodNight
, это нормально. Но я хотел бы думать, что три класса могут реализовать whenUsed по-разному, но если нет, тогда все в порядке.
Возможно ли это с помощью реферата?
Спасибо за ввод.
namespace AbstractClas
{
class Program
{
static void Main(string[] args)
{
Salutation morn = new GoodMorning("beautiful day");
Salutation aftr = new GoodAfternoon("after lunch comfort food comma");
Salutation nigh = new GoodNight("light and brezzy night");
Console.WriteLine("morn is the saluataion used during the {0}.", morn.whenUsed());
Console.WriteLine("aftr is the saluataion used during the {0}.", aftr.whenUsed().ToUpper());
Console.WriteLine("nigh is the saluataion used during the {0}.", nigh.whenUsed());
if (morn is Salutation)
Console.WriteLine("morn is a Salutation");
if (morn is GoodMorning)
Console.WriteLine("morn is a GoodMorning");
if (morn is GoodAfternoon)
Console.WriteLine("morn is a GoodAfternoon");
else
Console.WriteLine("morn is NOT a GoodAfternoon");
if (morn is GoodNight)
Console.WriteLine("morn is a GoodNight");
else
Console.WriteLine("morn is NOT a GoodNight");
Console.ReadKey();
}
}
internal abstract class Salutation
{
protected string salutation = "";
protected string whenused = "";
internal abstract void salu(string str, string wUsed);
internal abstract string whenUsed();
}
internal class GoodMorning : Salutation
{
internal override void salu(string s, string w) { salutation = s; whenused = w; }
internal GoodMorning(string gm) { salu(gm, "morning".ToUpper()); }
internal override string whenUsed() { return whenused; }
}
internal class GoodAfternoon : Salutation
{
internal override void salu(string s, string w) { salutation = s; whenused = w; }
internal GoodAfternoon(string ga) {
char[] c = "afternoon".ToCharArray();
Array.Reverse(c);
salu(ga, new string(c));
}
internal override string whenUsed() { return whenused; }
}
internal class GoodNight : Salutation
{
internal override void salu(string s, string w) { salutation = s; whenused = w; }
internal GoodNight(string gn) { salu(gn, "night".ToUpper()); }
internal override string whenUsed() { return whenused.ToLower(); }
}
}
Не уверен, что я понимаю, о чем вы спрашиваете. Вы хотите изменить 'whenUsed' из метода в свойство только для чтения? Если да, не можете ли вы определить его как «внутреннюю абстрактную строку whenUsed {get; } 'в' Приветствие' и переопределить его как 'внутренняя строка переопределения whenUsed {get {return/* независимо от того, какой конкретный класс хочет вернуть * /; }} '? – KMoussa
Свойства могут быть отменены так же, как методы – Fabio
@KMoussa Ваш комментарий показывает, что вы, очень ясно, понимаете. Я вижу, что я сделал не так. Я не реализовал '{get; } 'как реализация в свойстве When Salutation. Благодарю. – Steve