Pour expliquer mon problème ici est un exemplePolymorphisme et problème coulée
namespace CheckAbstarct
{
class Program
{
static void Main(string[] args)
{
myAbstarctClass mac1 = ObjectFactory.ObjectCreator("aaa");
myAbstarctClass mac2 = ObjectFactory.ObjectCreator("bbb");
mac1.changeMyString();
mac2.changeMyString();
string myString = (string)mac2.returnMyObject();
DateTime myObject = (DateTime) mac1.returnMyObject();
object obj1 = mac1.returnMyObject();
object obj2 = mac2.returnMyObject();
myMethod(obj1); //---> This is not compiling
myMethod(obj2); //---> This is not compiling
myMethod(myString); //---> works fine
myMethod(myObject); //---> works fine
Console.ReadKey();
}
public static void myMethod(DateTime dt)
{
}
public static void myMethod(string st)
{
}
}
abstract class myAbstarctClass
{
protected string mMyString;
public myAbstarctClass()
{
mMyString = "myAbstarctClass ";
}
public abstract void changeMyString();
public abstract object returnMyObject();
}
class MyNewAbstractClass1 : myAbstarctClass
{
DateTime mObject;
public MyNewAbstractClass1(string myString)
{
mMyString = myString;
mObject = new DateTime().Date;
}
public override void changeMyString()
{
mMyString += " MyNewAbstractClass1";
Console.WriteLine(mMyString);
}
public override object returnMyObject()
{
return mObject;
}
}
class MyNewAbstractClass2 : myAbstarctClass
{
string mString;
public MyNewAbstractClass2(string myString)
{
mMyString = myString;
mString = mMyString;
}
public override void changeMyString()
{
mMyString += " MyNewAbstractClass2";
Console.WriteLine(mMyString);
}
public override object returnMyObject()
{
return mString;
}
}
static class ObjectFactory
{
public static myAbstarctClass ObjectCreator(string myString)
{
switch (myString)
{
case "aaa":
return new MyNewAbstractClass1(myString);
case "bbb":
return new MyNewAbstractClass2(myString);
default:
return null;
}
}
}
}
Mon problème est que dans Main() Je ne sais pas quel type de la méthode returnMyObject() retourne donc je ne peux pas envoyez-le à MyMethod. Y a-t-il un moyen de lancer les objets ??
Peut-être que vous devriez utiliser (typeof (obj1)) obj1? –
Le problème que vous rencontrez est un symptôme de mauvaise conception - ce n'est pas vraiment la façon dont le polymorphisme est censé être utilisé. L'héritage est censé être une relation "est-un" (par exemple. 'MyNewAbstractClass1' IS-A' myAbstarctClass', 'MyNewAbstractClass2' IS-A' myAbstarctClass'). Toutes les fonctions qui opèrent sur le type abstrait ou l'un de ses sous-types devraient pouvoir le faire sans connaître le type spécifique de l'objet (et dans votre cas devrait lister 'myAbstarctClass' comme le type de paramètre représentant l'objet).Pas besoin de connaître le type réel est la puissance réelle derrière Polymorphisme. – MatthewD
Alors, quelle est votre suggestion à ce problème. Quelle solution considéreriez-vous comme un bon design pour ce genre de problème? – user411931