2016-11-25 2 views
0

Я пробовал и пытался, но я не уверен, как это сделать.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(); } 
    } 

} 
+1

Не уверен, что я понимаю, о чем вы спрашиваете. Вы хотите изменить 'whenUsed' из метода в свойство только для чтения? Если да, не можете ли вы определить его как «внутреннюю абстрактную строку whenUsed {get; } 'в' Приветствие' и переопределить его как 'внутренняя строка переопределения whenUsed {get {return/* независимо от того, какой конкретный класс хочет вернуть * /; }} '? – KMoussa

+0

Свойства могут быть отменены так же, как методы – Fabio

+0

@KMoussa Ваш комментарий показывает, что вы, очень ясно, понимаете. Я вижу, что я сделал не так. Я не реализовал '{get; } 'как реализация в свойстве When Salutation. Благодарю. – Steve

ответ

2

Если вы хотите изменить whenUsed от метода только для чтения собственности, вы можете определить его как

internal abstract string whenUsed { get; } 

в Salutation, а затем заменить его в качестве

internal override string whenUsed { get { return /*whatever the specific class wants to return*/; } } 

в ваших производных классах

+0

Спасибо за повторную публикацию, чтобы я мог ее принять – Steve

Смежные вопросы