Почему строка, помеченная //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);
}
}
Попробуйте реализовать интерфейс:
Пример:
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
Это не компилируется, поскольку в отношении компилятора 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);
}
Поскольку вы передаете типично типизированный объект с 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
MethodOne
в качестве метода в абстрактном классе, но вызовите MethodTwo
.