Метод перегрузки и полиморфизм Пересмотрен - PullRequest
0 голосов
/ 30 июля 2011

Нечто подобное должно быть возможно в C #, верно?

    public void Start ()
    {
        Class1 x = new Class1 ();

        string s = Something (x);

        Console.ReadKey ();
    }

    public string Something (IInterface obj)
    {
        return foo (obj);  //  <-- Problem line
    }

    public string foo (Class1 bar)
    {
        return "Class1";
    }

    public string foo (Class2 bar)
    {
        return "Class2";
    }

    interface IInterface {}

    class Class1 : IInterface {}

    class Class2 : IInterface {}

Ответы [ 3 ]

2 голосов
/ 30 июля 2011

Нет.Ваши методы foo ожидают либо Class1, либо Class2.Вы передаете IInterface, который может быть либо Class1, либо Class2.Он не скомпилируется, потому что компилятор не знает, какой перегруженный метод вызывать.Вам придется привести его к одному из типов, чтобы заставить его скомпилировать.

В качестве альтернативы IInterface будет содержать метод foo, который не принимает аргументов и возвращает какой класс он был.Тогда что-то может взять объект IInterface и вызвать obj.foo()

Как:

interface IInterface 
{ 
    public string foo(); 
}

class Class1 : IInterface
{
     public string foo()
     {
         return "Class1";
     }
}

class Class2 : IInterface
{
     public string foo()
     {
         return "Class2";
     }
}

public void Something(IInterface obj)
{
    return obj.foo();
}
1 голос
/ 30 июля 2011
public string Something (IInterface obj)
{
    return foo ((Class1)obj); 
    OR // There's no way compiler to know with method to call.
    return foo ((Class2)obj); 
}

public string foo (Class1 bar)
{
    return "Class1";
}

public string foo (Class2 bar)
{
    return "Class2";
}
0 голосов
/ 30 июля 2011

Нет, куда идут не виртуальные вызовы, определяется во время компиляции, поэтому вы не можете вызывать различные методы в зависимости от типа во время выполнения.

То, что вы можете искать, это виртуальные методы:

public void Start () {
  Class1 x = new Class1();

  string s = Something(x);

  Console.ReadKey();
}

public string Something (BaseClass obj) {
  return obj.foo();
}

abstract class BaseClass {
  abstract string Foo();
}

class Class1 : BaseClass {

  public override string foo () {
    return "Class1";
  }

}

class Class2 : BaseClass {

  public override string foo () {
    return "Class2";
  }

}
...