Параметры метода и перегрузка - PullRequest
2 голосов
/ 03 февраля 2011

Можно ли сделать что-то подобное:

class Program
{
    static void Main(string[] args)
    {
        Customer1 c1 = new Customer1();
        DoSomething(c1);

        Customer2 c2 = new Customer2();
        DoSomething(c2);
    }

    static void DoSomething<T>(T customer)
    {
        //... code here ...
        InitializeCustomer(customer); // <- error indeed :-(
        //... code here ...
    }

    static void InitializeCustomer(Customer1 c1)
    {
        c1.Reference = 1234;
        c1.Name = "John";
    }

    static void InitializeCustomer(Customer2 c2)
    {
        c2.Name = "Mary";
        c2.Town = "Tokyo";
    }
}

class Customer1
{
    public int Reference;
    public string Name;
}

class Customer2
{
    public string Name;
    public string Town;
}

Я бы хотел избежать создания двух методов "DoSomething", а также повторного копирования кода с различными параметрами метода.Я думал также использовать объект в качестве параметра, но мне нужно привести его после этого ... Можете ли вы посоветовать мне?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 03 февраля 2011

Поскольку Customer1 и Customer2 не имеют общего интерфейса, это невозможно.

Однако вы можете переработать это так, чтобы они были производными от базового класса (или интерфейса) и выполняли свою собственную инициализацию. Это также будет намного чище, поскольку позволяет каждому Customer инициализировать себя, что обеспечивает более четкое разделение проблем.

Например:

class Program
{
    static void Main(string[] args)
    {
        Customer1 c1 = new Customer1();
        DoSomething(c1);

        Customer2 c2 = new Customer2();
        DoSomething(c2);
    }

    static void DoSomething<T>(T customer) where T : Customer
    {
        //... code here ...
        customer.Initialize();
        //... code here ...
    }
}

abstract class Customer
{
    public abstract void Initialize();

}
class Customer1 : Customer
{
    public int Reference;
    public string Name;

    public override void Initialize()
    {
        this.Reference = 1234;
        this.Name = "John";
    }
}

class Customer2 : Customer
{
    public string Name;
    public string Town;

    public override void Initialize()
    {
        this.Name = "Mary";
        this.Town = "Tokyo";
    }
}
2 голосов
/ 03 февраля 2011

Ваши Customer1 и Customer2 должны наследоваться от общего класса AbstractCustomer или ICustomer интерфейса.

Это позволит вам использовать single метод, который обрабатываетоба, а также устраняют необходимость в дженериках:

static void DoSomething(ICustomer customer)
{
    //... code here ...
    InitializeCustomer(customer); 
    //... code here ...
}

static void InitializeCustomer(ICustomer c)
{
    c.Reference = 1234;
    c.Name = "John";
}

Как отмечает @ Рид Копси , это решение предполагает, что оба типа имеют одинаковые члены.

Если вы предоставляете одинаковый метод инициализации для обоих (это условия сигнатуры метода), вы можете инициализировать их отдельно.

0 голосов
/ 03 февраля 2011

Может поделитесь интерфейсом?

interface ICustomer
{
    void Initialize();
}

class Program
{

    static void Main(string[] args)
    {
        Customer1 c1 = new Customer1();
        DoSomething(c1);

        Customer2 c2 = new Customer2();
        DoSomething(c2);
    }

    static void DoSomething<T>(T customer) where T : ICustomer
    {
        customer.Initialize();
     }
}

class Customer1 : ICustomer
{
    public void Initialize()
    {
        Reference = 1234;
        Name = "John";
    }

    public int Reference;
    public string Name;
}

class Customer2 : ICustomer
{
    public void Initialize()
    {
        Name = "Mary";
        Town = "Tokyo";
    }

    public string Name;
    public string Town;
}
0 голосов
/ 03 февраля 2011

Для этого необходим отдельный экземпляр класса.

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

...