none
"Разбор" примера. RRS feed

  • Вопрос

  • Здравствуйте!

    Изучаю самостоятельно С# по книге Э. Стиллмен "Изучаем С#". Хотел бы чтоб пояснили пример.

    вот четыре класса.

    namespace Наследование { class Jewels //Драгоценности { public string Sparkle() //Блеск { return " Sparkle, sparkle! "; } } } namespace Наследование { class Safe //Сейф { private Jewels contnts = new Jewels(); //contents - содержимое. Класс сейф в своем парраметре содержит ссылку на класс private string safeCombination = "12345"; public Jewels Open (string combination) { if (combination == safeCombination) return contnts; else return null; } public void PickLock (Locksmith lockpicker) { lockpicker.WriteDownCombination(safeCombination); } } } class Locksmith //Слесарь { public void OpenSafe(Safe safe, Owner owner) { safe.PickLock(this); Jewels safeContents = safe.Open( writenDownCombination); ReturnContents(safeContents,owner); } private string writenDownCombination = null; public void WriteDownCombination(string combination) { writenDownCombination = combination; } virtual public void ReturnContents(Jewels safeContents, Owner owner) { owner.ReceiveContents(safeContents); } }

    class Owner //Владелец
    {
    private Jewels retrnedContents;
    public void ReceiveContents (Jewels safeContens)
    {
    retrnedContents = safeContens;
    Console.WriteLine("Thanf you "+ safeContens.Sparkle ());
    }
    }

    class JewelThief : Locksmith //Вор
    {
    private Jewels stolenJewels = null;
    override public void ReturnContents(Jewels safeContents, Owner owner)
    {
    stolenJewels = safeContents;
    Console.WriteLine("I'm stealing the contents " + stolenJewels.Sparkle());
    }

    }

    непонятна для примера такая запись:

    virtual public void ReturnContents(Jewels safeContents, Owner owner)
    {
    owner.ReceiveContents(safeContents);
    }

      public void OpenSafe(Safe safe, Owner owner)

    как мы можем в параметрах метода передавать класс??? что-то в голове не укладываются подобные записи.

    13 марта 2014 г. 19:15

Ответы

  • Класс описывает новый тип данных, объекты которого можно использовать где угодно, передавать в параметре в том числе. Что именно Вас удивляет?


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Edik2012 14 марта 2014 г. 11:00
    13 марта 2014 г. 19:21
  •  virtual public void ReturnContents(Jewels safeContents, Owner owner)  //class Locksmith
           
    {
                owner
    .ReceiveContents(safeContents);
           
    }

    public void ReceiveContents (Jewels safeContens)                                //class owner
            {
                retrnedContents = safeContens;
                Console.WriteLine("Thanf you "+ safeContens.Sparkle ());
            }

    тут нет ничего особенного. локсмит методом returnContents присваевает объект Jewels в поле класса Owner, и этот Owner будет хранить его пока будет жив объект safeContents


    • Помечено в качестве ответа Edik2012 14 марта 2014 г. 11:00
    14 марта 2014 г. 5:22
  • ну конечно, только именно к тому объекту, и только внутри класса, так как модификатор стоит private
    • Изменено Medet Tleukabiluly 14 марта 2014 г. 11:39
    • Помечено в качестве ответа Edik2012 14 марта 2014 г. 12:20
    14 марта 2014 г. 11:38
  • да,

    private Jewels retrnedContents;
     //класс Owner

    ведь тип поля retrnedContents является Jewel, другое он и не примет.

    пример ваш очень замароченный, наверное вы пытаетесь понять наследование, полиморфизм и все такое. но есть способы по лучше, например интерфейсы

    самый простой пример ниже

    interface ITest
     {
      Jewels retrnContents {get; set;}
     }
    interface ITestAnother
     {
      Owner retrnContents {get; set;}
     }
    
    public class Owner:ITest
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
     }
    public class Lorsmith:ITest
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
     }
    public class Jewels:ITest, ITestAnother
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
      private Owner _retrnContentsAnother;
      public Owner retrnContentsAnother {
           get { return _retrnContentsAnother; } 
           set { _retrnContentsAnother = value; }
         }
    
     }

    можно сказать о приимуществах довольно много, еще и класс может наследовать класс, тогда все это получится примерно

    interface ITest
     {
      Jewels retrnContents {get; set;}
     }
    
    public class Owner:ITest
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
     }
    public class Lorsmith:ITest
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
      private Owner _retrnContentsAnother;
      public virtual Owner retrnContentsAnother {
           get { return _retrnContentsAnother; } 
           set { _retrnContentsAnother = value; }
         }
     }
    public class Jewels:Lorsmith, ITest
    {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
      
      public override Owner retrnContentsAnother {
           get { return null; } 
           set ;
         }
     }
    может сейчас вам сложно будет уловить зачем эти интерфейсы и наследования и прочее. но они очень мощные вещи, в трех словах можно сказать: у вас есть класс Square, Rectangle, Circle. Можем сделать для них всех 1 интерфейс Area, а вот длину например могут иметь только Rectangle и Square, вот еще 1 интерфейс для них. Еще допустим надо нам узнать..к примеру - на сколько надо умножить 1  ребро что бы получить n-ную длину всех ребер, вот вам и еще 1 интерфейс для Square (и только для него). И вам придется лишь наследовать от 1 класса - Geometry. Успешных разработок1 

    • Изменено Medet Tleukabiluly 14 марта 2014 г. 13:47
    • Помечено в качестве ответа Edik2012 14 марта 2014 г. 18:11
    14 марта 2014 г. 13:45

Все ответы

  • Класс описывает новый тип данных, объекты которого можно использовать где угодно, передавать в параметре в том числе. Что именно Вас удивляет?


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Edik2012 14 марта 2014 г. 11:00
    13 марта 2014 г. 19:21
  •  virtual public void ReturnContents(Jewels safeContents, Owner owner)  //class Locksmith
           
    {
                owner
    .ReceiveContents(safeContents);
           
    }

    public void ReceiveContents (Jewels safeContens)                                //class owner
            {
                retrnedContents = safeContens;
                Console.WriteLine("Thanf you "+ safeContens.Sparkle ());
            }

    тут нет ничего особенного. локсмит методом returnContents присваевает объект Jewels в поле класса Owner, и этот Owner будет хранить его пока будет жив объект safeContents


    • Помечено в качестве ответа Edik2012 14 марта 2014 г. 11:00
    14 марта 2014 г. 5:22
  • Получается что поле класса owner содержит ссылку на объект. Из это следует что к объекту можно обратиться через поле?
    14 марта 2014 г. 10:59
  • ну конечно, только именно к тому объекту, и только внутри класса, так как модификатор стоит private
    • Изменено Medet Tleukabiluly 14 марта 2014 г. 11:39
    • Помечено в качестве ответа Edik2012 14 марта 2014 г. 12:20
    14 марта 2014 г. 11:38
  •        virtual public void ReturnContents(Jewels safeContents, Owner owner)
            {
                owner.ReceiveContents(safeContents);
            }

    Здесь получается в параметр передается тип переменной  Jewels и   Owner, а  здесь   private Jewels retrnedContents; создается переменная типа  Jewels? получается это просто ссылки на класс чтоб иметь к ним доступ ? и если указан тип  Jewels, то   Owner или какой другой сюда не поставишь? 
    14 марта 2014 г. 12:19
  • да,

    private Jewels retrnedContents;
     //класс Owner

    ведь тип поля retrnedContents является Jewel, другое он и не примет.

    пример ваш очень замароченный, наверное вы пытаетесь понять наследование, полиморфизм и все такое. но есть способы по лучше, например интерфейсы

    самый простой пример ниже

    interface ITest
     {
      Jewels retrnContents {get; set;}
     }
    interface ITestAnother
     {
      Owner retrnContents {get; set;}
     }
    
    public class Owner:ITest
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
     }
    public class Lorsmith:ITest
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
     }
    public class Jewels:ITest, ITestAnother
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
      private Owner _retrnContentsAnother;
      public Owner retrnContentsAnother {
           get { return _retrnContentsAnother; } 
           set { _retrnContentsAnother = value; }
         }
    
     }

    можно сказать о приимуществах довольно много, еще и класс может наследовать класс, тогда все это получится примерно

    interface ITest
     {
      Jewels retrnContents {get; set;}
     }
    
    public class Owner:ITest
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
     }
    public class Lorsmith:ITest
     {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
      private Owner _retrnContentsAnother;
      public virtual Owner retrnContentsAnother {
           get { return _retrnContentsAnother; } 
           set { _retrnContentsAnother = value; }
         }
     }
    public class Jewels:Lorsmith, ITest
    {
      private Jewels _retrnContents;
      public Jewels retrnContents {
           get { return _retrnContents; } 
           set { _retrnContents = value; }
         }
      
      public override Owner retrnContentsAnother {
           get { return null; } 
           set ;
         }
     }
    может сейчас вам сложно будет уловить зачем эти интерфейсы и наследования и прочее. но они очень мощные вещи, в трех словах можно сказать: у вас есть класс Square, Rectangle, Circle. Можем сделать для них всех 1 интерфейс Area, а вот длину например могут иметь только Rectangle и Square, вот еще 1 интерфейс для них. Еще допустим надо нам узнать..к примеру - на сколько надо умножить 1  ребро что бы получить n-ную длину всех ребер, вот вам и еще 1 интерфейс для Square (и только для него). И вам придется лишь наследовать от 1 класса - Geometry. Успешных разработок1 

    • Изменено Medet Tleukabiluly 14 марта 2014 г. 13:47
    • Помечено в качестве ответа Edik2012 14 марта 2014 г. 18:11
    14 марта 2014 г. 13:45
  • да, это пример наследования и перекрытия методов. Спасибо за ответы. Про интерфейсы ничего не понял. Но пойду по порядку, по книге.
    14 марта 2014 г. 15:49