Как вызвать метод в другом классе из универсального метода?

1

Почему строка, помеченная //Dont work in the bottom of the code?

Я хочу повторно использовать метод WriteMessage с разными классами, я пытаюсь использовать generics, но я не уверен, как его использовать.

class ClassOne
{
    public string MethodOne()
    {
        return ("ClassOne");
    }

    public string MethodTwo()
    {
        return ("ClassOne -MethodTwo ");
    }
}

class ClassTwo 
{
    public string MethodOne()
    {
        return ("ClassTwo");
    }

    public string MethodTwo()
    {
        return ("ClassOne -MethodTwo ");
    }
}

class Program
{
    private static void Main()
    {
        var objectOne = new ClassOne();
        WriteMessage(objectOne);

        var objectTwo = new ClassTwo();
        WriteMessage(objectTwo);
        Console.ReadKey();
    }

    public static void WriteMessage<T>(T objectA)
    {
        var text = objectA.MethodTwo();  //Dont Work
        Console.WriteLine("Text:{0}", text);
    }
}
Теги:

3 ответа

4

Попробуйте реализовать интерфейс:

Пример:

public interface IHasTwoMethods
{
 string MethodOne()
 string MethodTwo()
}

Внесите эту информацию в свои классы:

class ClassOne : IHasTwoMethods
class ClassTwo : IHasTwoMethods

Затем в вашем общем методе выполните следующие действия:

public static void WriteMessage<T>(T objectA) where T : IHasTwoMethods
    {
        var text = objectA.MethodTwo();  //Will work
        Console.WriteLine("Text:{0}", text);
    }

Подробнее о интерфейсах вы можете узнать здесь: http://msdn.microsoft.com/en-us/library/87d83y5b.aspx

  • 1
    +1 Более важной концепцией здесь является ограничение общего типа (не интерфейса), но решение правильное.
2

Это не компилируется, поскольку в отношении компилятора objectA является просто Object.

Чтобы заставить это работать, вам нужно использовать ограничение общего типа:

public interface MyInterface
{
   string MethodTwo();
}

public class A : MyInterface
{
   ...
}

public class B : MyInterface
{
   ...
}

public static void WriteMessage<T>(T objectA) where T: MyInterface
{
    var text = objectA.MethodTwo();  //Will Work!
    Console.WriteLine("Text:{0}", text);
}

MSDN: ограничения на параметры типа

  • 0
    @elgonzo Да, я думаю, что набрал это по крайней мере 3 или 4 раза, написав этот пост :(
  • 0
    Не волнуйтесь, мне было весело говорить вслух "Method2 - это не то же самое, что MethodTwo";)
Показать ещё 1 комментарий
1

Поскольку вы передаете типично типизированный объект с T, компилятор не знает, какой класс вы используете - для всего, что он знает, это может быть int или Application или что-то еще.

Вероятно, вы хотите, чтобы ClassOne и ClassTwo наследовали от другого класса, у которого есть абстрактный класс MethodTwo который реализуется. Что-то вроде...

abstract class SuperClass
{
    public abstract string MethodOne();
}

class ClassOne : SuperClass
{
    public override string MethodOne()
    {
        return ("ClassOne");
    }
}

затем в Main:

public static void WriteMessage<T>(T objectA) where T : SuperClass
{
    var text = objectA.MethodOne();
    Console.WriteLine("Text:{0}", text);
}

Ознакомьтесь с наследованием С# здесь: http://msdn.microsoft.com/en-us/library/ms173149.aspx

  • 1
    Технически это не сработает, так как у вас есть MethodOne в качестве метода в абстрактном классе, но вызовите MethodTwo .
  • 0
    Неряшливая копия-паста с моей стороны.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню