How to call a subclass method for an object of a base class?

I use a library that generates a bunch of classes for me.

These classes all inherit from a common base class, but this base class does not define pairs of methods that are common to all subclasses.

For example:

SubClassA : BaseClass{
  void Add(ItemA item) {...}
  ItemA CreateNewItem() {...}
}

SubClassB: BaseClass{
  void Add(ItemB item) {...}
  ItemB CreateNewItem() {...}
}

Unfortunately, the base class does not have these methods . It would be great:

BaseClass{
  // these aren't actually here, I'm just showing what missing:
  abstract void Add(ItemBaseClass item);  // not present!
  abstract ItemBaseClass CreateNewItem(); // not present!
}

Since there is a common base class for my A + B objects and a common base class for Item objects, I was hoping to capitalize on the wonderful world of polymorphism.

Unfortunately, since ordinary methods are not actually present in the base class, I cannot actually name them. for example, this would be ideal:

BaseClass Obj;
Obj = GetWorkUnit(); // could be SubClassA or SubClassB

ItemBaseClass Item = Obj.CreateNewItem(); // Compile Fail: CreateNewItem() isn't in the base class

Item.DoSomething();

Obj.Add(Item); // Compile Fail: Add(...) isn't in the base class

Obviously casting will work, but then I will need to know what type I had that would deny the benefits.

"" ? , , . , VB - intellisense, , :

CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB

Againt, (, , ).

+3
7

, . , :

// obj is your object reference.
obj.GetType().InvokeMember("MethodName", 
    System.Reflection.BindingFlags.InvokeMethod, null, obj, null /* args */)
+6

- , ?

, , , , , ( , ).

+3

Visual Studio 2008, . . 2.0, VS 2008. :

public static class MyExtensions
{
   public static ItemBaseClass CreateNewItem(this BaseClass item)
   {
      return item.GetType().InvokeMember("MethodName", System.Reflection.BindingFlags.InvokeMethod, null, obj, null /* args */);
   }
}
0

- -, RealProxy ( ) , DynamicMethods, , , . , , MSIL.

0

№1: № 2: ,

, , , , . , , .

class ItemBase{}

class ItemA : ItemBase{}

class ItemB : ItemBase{}

class BaseClass
{
    public virtual void Add(ItemBase item){}
    public virtual ItemBase CreateItem() { return null; }
}

class ClassA : BaseClass
{
    public override void Add(ItemBase item)
    {
        //do whatever
        throw new NotImplementedException();
    }

    public ItemBase CreateItem()
    {
        //create an ItemBase and return
        throw new NotImplementedException();
    }
}
0

"" . - "", , "" . , :

BaseClass{
  abstract void Add(ItemBaseClass item);  // not present!
  abstract ItemBaseClass CreateNewItem(); // not present!
}

SubClassA : BaseClass{
  override void Add(ItemA item) {...}
  override ItemA CreateNewItem() {...}
}

SubClassB: BaseClass{
  override void Add(ItemB item) {...}
  override ItemB CreateNewItem() {...}
}

, .

-1

Source: https://habr.com/ru/post/1706545/


All Articles