C#Learner12 Ответов: 2

Реализация интерфейса icomparable в программу


Я уже начал это делать, но мне действительно трудно, я должен изменить кошелек класса, чтобы реализовать интерфейс ICloneable . создайте основную программу, которая продемонстрирует, что метод кошелька Clone работает.

using System;
using System.Collections;

namespace TestingProject
{
   /// <summary>
   /// A coin with a monetary value.
   /// </summary>
   public class Coin   {

       ///   Constructs a coin.
       ///   @param aValue the monetary value of the coin
       ///   @param aName the name of the coin
       public Coin(double aValue, String aName)
       {
           value = aValue;
           name = aName;
       }

       /// Gets the coin value.
       /// @return the value
       public double GetValue()   
       {
           return value;
       }

       ///   Gets the coin name.
       /// @return the name
       public String GetName()
       {
           return name;
       }
      
       public override bool Equals(Object otherObject)
       {
           Coin other = (Coin)otherObject;
           return name==other.name
               && value == other.value;
       }

       // C# requirement:
       // since we override Equals, MUST also override GetHashCode ( !! )
       public override int GetHashCode()
       {
           return base.GetHashCode ();
       }


      

       private double value;
       private string name;
   }
}

using System;
using System.Collections;

namespace TestingProject
{
   /// <summary>
   /// A purse holds a collection of coins.
   /// </summary>
   public class Purse : ICloneable
   {
       /// Constructs an empty purse.
       public Purse()
       {
           coins = new ArrayList();
           Purse MyPurse = (Purse)MemberwiseClone();
       }

       /// Add a coin to the purse.
       /// @param aCoin the coin to add
       public void Add(Coin aCoin)
       {
           coins.Add(aCoin);
       }

       /// Get the total value of the coins in the purse.
       /// @return the sum of all coin values
       public double GetTotal()
       {
          
           double total = 0;
           for (int i = 0; i < coins.Count; i++)
           {
               Coin aCoin = (Coin)coins[i];
               total = total + aCoin.GetValue();
           }
           return total;
       }

       public Object Clone()
       {
           return MemberwiseClone();
       }
      

       private ArrayList coins;
   }

}


Что я уже пробовал:

Я запустил программу, но я просто застрял и запутался

Richard Deeming

Название вашего вопроса говорит о том, что вы пытаетесь реализовать IComparable, но тело вопроса говорит, что вы пытаетесь реализовать ICloneable- И что же это?

2 Ответов

Рейтинг:
16

Sandeep Mewara

Ссылка: Интерфейс ICloneable (Системы) | Майкрософт Документы[^]

Цитата:
Интерфейс ICloneable просто требует, чтобы ваша реализация метода Clone() возвращала копию текущего экземпляра объекта. Он не указывает, выполняет ли операция клонирования глубокую копию, неглубокую копию или что-то среднее. Он также не требует, чтобы все значения свойств исходного экземпляра были скопированы в новый экземпляр.


Пример Реализации:
public class Person : ICloneable
{
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public Person(){}

        public Person(Person p)
        {
            this.FirstName = p.FirstName;
            this.LastName = p.LastName;
        }

        public object Clone()
        {
            return new Person(this);
        }
}

Использование:
static void Main(string[] args)
{
            Person p1 = new Person { FirstName = "Sandeep", LastName = "Mewara" };
            Console.Write("Name in p1:- " + p1.FirstName + "\n");
            Person p2 =(Person) p1.Clone();
            Console.Write("Name in p2:- " + p2.FirstName);
            Console.ReadLine();
}


Maciej Los

5ed!

Sandeep Mewara

Спасибо!

Рейтинг:
11

BillWoodruff

Цитата:
но я просто застрял и запутался
Да, это так, и в этом нет ничего плохого; все здесь когда-то были новичками, а C# и фреймворк сложны.

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

Считать:

1 в конструкторе кошелька: Кошелек MyPurse = (кошелек)MemberwiseClone();

вы создаете копию в закрытой переменной, к которой невозможно получить доступ снаружи конструктор

2 класс Coins не наследуется от IEquatable<Coin> : переопределения, которые вы определяете, никогда не будут использоваться

3 Обратите внимание, что 'ArrayList-это старая, устаревшая структура; используйте список<Coin> ... использование строго типизированного списка означает, что вам не нужно бросать от объекта к монете.

Что делать: найдите в CodeProject рекомендуемые книги по C# и найдите такие ресурсы, как этот: [^], [^], [^]
«... thank the gods that they have made you superior to those events which they have not placed within your own control, rendered you accountable for that only which is within you own control For what, then, have they made you responsible? For that which is alone in your own power—a right use of things as they appear.» Discourses of Epictetus Book I:12