0

だから私は現在、名簿プログラムを持っているので(これ以上派手なものを書くのは好きではなかったので、意図的に基本的です)、評価のモジュールが行われています(これは学校の仕事ではありません)。

このモジュールでは、ポリモーフィズム、カプセル化、継承を実証する必要があります。

以下に示すように、IEnumerableカウントをポリモーフィズムとして実装するかどうか疑問に思いましたか?

public class AddressBookEnumerator : IEnumerator
{
    #region IEnumerable Implementation
    public Person[] Contacts;
    int Position = -1;

    public AddressBookEnumerator(Person[] ContactList)
    {
        Contacts = ContactList;
    }

    public bool MoveNext()
    {
        Position++;
        return (Position < Contacts.Length);
    }

    public void Reset()
    {
        Position = -1;
    }

    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }

    public Person Current
    {
        get
        {
            try
            {
                return Contacts[Position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
    #endregion
}

IEnumeratorクラスを継承し、特定のクラスに対して異なる動作をする新しいメソッドを作成したためかどうかだけ疑問に思いますか?それとも、IEnumeratorがどのように機能するかを誤解しているだけですか。

4

3 に答える 3

1

ポリモーフィズム

さまざまなデータ型の値を統一されたインターフェイスを使用して処理できるようにするプログラミング言語機能。

提供されている現在のコードでは、操作しているデータ型が1つだけ表示されます。

実装とは、特定のインターフェースのコントラクトIEnumerableをサブスクライブすることであるため、タイプはそのインターフェースのような脅威になる可能性があります。私は個人的に、このコードを例のように示すことはしません。polymorphism

于 2012-10-05T10:07:07.900 に答える
1

早く分解してみますが、

interface IOrganism
{
    string GetSpecies();
}

abstract class Animal : IOrganism
{
    abstract string GetSpecies();
}

class Rat : Animal
{
   public virtual string GetSpecies()
   {
      return "Ratus";
   }
}

sealed class BlackRat : Rat
{
    public override string GetSpecies()
    {
       return string.Format("{0} Ratus", base.GetSpecies()));
    }
}

AnimalRatおよびBlackRatはすべて。で多形IOrganismです。RatBlackRatは多形Animalです。最後に、BlackRatは。で多形Ratです。


つまり、関数を書くことができます。

void OutputSpecies(IOrganism organism)
{
    Console.WriteLine(organism.GetSpecies());
}

の任意の実装者を受け入れることができます。それが、または将来の実装者IOrganismであるかどうかにかかわらず、それらはすべて。で多形であるためです。RatBlackRatIOrganism


したがって、元の質問に答えるために、インターフェイスを実装し、IEnumerableそれを関数の引数として使用することは、ポリモーフィズムを使用することです。ただし、コードは実装するだけIEnumeratorなので、中途半端です。それは多型の可能性を示していますが、実際には多型ではありません。

さらに、IEnumerator例として使用すると、目的のタスクの邪魔になる可能性があり、例をより抽象的に保つ方がよい場合があります。

于 2012-10-05T10:22:18.390 に答える
1

インターフェイスレベルでタイプをポリモーフィズムとして扱うことを検討できますが、よりアカデミックなアプローチでは、おそらくこれらの種類の線に沿ってより多くのことを考えていますか?

ここに私達は見る:

  • 抽象基本クラスからの継承Employee
  • メソッドを参照するときのカプセル化/ポリモーフィズムGetBonusMultiplier。抽象基本クラスからメソッドを参照することができ、各タイプが基本乗数をどのように決定するかについての内部も認識していません。私たちが知っている/注意しているのは、メソッドを呼び出すと、int値が返されるということだけです。

Employeeをインターフェースに変更したい場合IEmployeeは、簡単です。共通のフィールドをキャプチャするためのある種の抽象的なベースがまだあると思いますが、を実装する各クラスで再実装する必要はありませんIEmployee

class Program
{
    static void Main(string[] args)
    {
        var employees = new List<Employee>
        {
            new Manager(1, "Dave Smith"),
            new Director(2, "Peter Thompson")
        };

        foreach (Employee employee in employees)
        {
            Console.WriteLine(string.Format("Employee ID: {0}. Employee Name: {1}. Bonus Multiplier: {2}.", employee.Id, employee.Name, employee.GetBonusMultiplier()));
        }
        Console.ReadKey();
    }
}

abstract class Employee
{
    public int Id { get; protected set; }
    public string Name { get; protected set; }

    public abstract int GetBonusMultiplier();
}

class Director : Employee
{
    public Director(int employeeId, string name)
    {
        Id = employeeId;
        Name = name;
    }

    public override int GetBonusMultiplier()
    {
        return 3;
    }
}

class Manager : Employee
{
    public Manager(int employeeId, string name)
    {
        Id = employeeId;
        Name = name;
    }

    public override int GetBonusMultiplier()
    {
        return 2;
    }
}
于 2012-10-05T10:32:06.140 に答える