调用抽象 class 类型 C# 的子实现
Call child implementation of abstract class type C#
我想在具有抽象 class 类型的对象上调用子 class 实现。但是,这并不像我想象的那样有效。
有没有办法做到这一点,不需要我在第二个切换语句中切换类型?还是 C# 不允许这种行为?
调用代码:
AbstractParentType wfp;
//Switch on diagram type and select processor
switch (qi.DIAGRAMTYPE)
{
case 1:
wfp = new T1(notifications);
break;
case 2:
wfp = new T2(notifications);
break;
case 3:
wfp = new T3(notifications);
break;
default:
throw new Exception("Diagramtype not implemented");
}
bool result = false;
//Switch on action type
switch (qi.Type)
{
case (int)WorkflowActionType.BelItem:
//Do some case specific stuff here
...
//Call method
result = wfp.Meth1();
break;
... (a bunch of cases) ...
case (int)WorkflowActionType.WordDocument:
//Do some case specific stuff here
...
//Call method
result = wfp.Meth10();
break;
}
然后我们有 classes 实现:
abstract class AbstractClassType {
public bool Meth1() { ... }
...
public bool Meth10() { ... }
...
public abstract MethX();
public abstract MethY();
}
class T1 : AbstractClassType {
public new Meth1() { ... }
...
public new Meth10() { ... }
...
public override MethX() { ... }
public override MethY() { ... }
}
实际的方法确实有参数,我确实想要一些方法(但不是全部)的基本实现。目标是允许继承 classes 到 'extend' 方法行为。
尝试使用 virtual
keyword
使用虚拟时,您可以为基础 class 中的方法提供 'default' 实现。像这样:
abstract class AbstractClassType {
public virtual void MethX(){
//default implementation here.
}
public virtual void MethY(){
//another default implementation here!
}
}
class T1 : AbstractClassType {
public override void MethX(){
//base.MethX() would call the logic in the base class.
}
public override void MethY(){
//base.MethY() would call the logic in the base class.
}
}
virtual
和 abstract
之间的区别基本上是,abstract
方法 不能 有基本实现,并且 必须被覆盖。
一个virtual
方法可以有一个基础实现,不需要重写。
您不需要致电 base.MethX/Y()
。如果愿意,您甚至可以赋予该方法全新的含义。
首先,你不能创建一个抽象的对象class,因为它不是真正完整的实体。您将始终需要实例化扩展抽象 class.
的 class 的对象
以下代码显示了使用抽象 classes 时的各种选项,而不是全部选项。
public abstract class AbstractClass
{
public void OnlyInAbstract() {
Console.WriteLine("You are stuck with OnlyInAbstract in abstract class unless you use new keyword.");
}
public virtual void OnlyInAbstractForNow()
{
Console.WriteLine("You have reached abstract class for now. However, override me for changed behaviour.");
}
public abstract void MustImplement();
}
public class FirstChild : AbstractClass
{
public override void MustImplement()
{
Console.WriteLine("You called MustImplement in FirstChild. Nothing else to see here.");
}
public override void OnlyInAbstractForNow()
{
base.OnlyInAbstractForNow();
Console.WriteLine("I see you changed my behaviour in FirstChild to extend it after abstract class was done with.");
}
public new void OnlyInAbstract()
{
Console.WriteLine("Looks like we are making an all new OnlyInAbstract method in child class.");
}
}
static void Main(string[] args)
{
AbstractClass abstractClass = new FirstChild();
abstractClass.MustImplement();
abstractClass.OnlyInAbstract();
(abstractClass as FirstChild).OnlyInAbstract();
abstractClass.OnlyInAbstractForNow();
Console.Read();
}
我想在具有抽象 class 类型的对象上调用子 class 实现。但是,这并不像我想象的那样有效。 有没有办法做到这一点,不需要我在第二个切换语句中切换类型?还是 C# 不允许这种行为?
调用代码:
AbstractParentType wfp;
//Switch on diagram type and select processor
switch (qi.DIAGRAMTYPE)
{
case 1:
wfp = new T1(notifications);
break;
case 2:
wfp = new T2(notifications);
break;
case 3:
wfp = new T3(notifications);
break;
default:
throw new Exception("Diagramtype not implemented");
}
bool result = false;
//Switch on action type
switch (qi.Type)
{
case (int)WorkflowActionType.BelItem:
//Do some case specific stuff here
...
//Call method
result = wfp.Meth1();
break;
... (a bunch of cases) ...
case (int)WorkflowActionType.WordDocument:
//Do some case specific stuff here
...
//Call method
result = wfp.Meth10();
break;
}
然后我们有 classes 实现:
abstract class AbstractClassType {
public bool Meth1() { ... }
...
public bool Meth10() { ... }
...
public abstract MethX();
public abstract MethY();
}
class T1 : AbstractClassType {
public new Meth1() { ... }
...
public new Meth10() { ... }
...
public override MethX() { ... }
public override MethY() { ... }
}
实际的方法确实有参数,我确实想要一些方法(但不是全部)的基本实现。目标是允许继承 classes 到 'extend' 方法行为。
尝试使用 virtual
keyword
使用虚拟时,您可以为基础 class 中的方法提供 'default' 实现。像这样:
abstract class AbstractClassType {
public virtual void MethX(){
//default implementation here.
}
public virtual void MethY(){
//another default implementation here!
}
}
class T1 : AbstractClassType {
public override void MethX(){
//base.MethX() would call the logic in the base class.
}
public override void MethY(){
//base.MethY() would call the logic in the base class.
}
}
virtual
和 abstract
之间的区别基本上是,abstract
方法 不能 有基本实现,并且 必须被覆盖。
一个virtual
方法可以有一个基础实现,不需要重写。
您不需要致电 base.MethX/Y()
。如果愿意,您甚至可以赋予该方法全新的含义。
首先,你不能创建一个抽象的对象class,因为它不是真正完整的实体。您将始终需要实例化扩展抽象 class.
的 class 的对象以下代码显示了使用抽象 classes 时的各种选项,而不是全部选项。
public abstract class AbstractClass
{
public void OnlyInAbstract() {
Console.WriteLine("You are stuck with OnlyInAbstract in abstract class unless you use new keyword.");
}
public virtual void OnlyInAbstractForNow()
{
Console.WriteLine("You have reached abstract class for now. However, override me for changed behaviour.");
}
public abstract void MustImplement();
}
public class FirstChild : AbstractClass
{
public override void MustImplement()
{
Console.WriteLine("You called MustImplement in FirstChild. Nothing else to see here.");
}
public override void OnlyInAbstractForNow()
{
base.OnlyInAbstractForNow();
Console.WriteLine("I see you changed my behaviour in FirstChild to extend it after abstract class was done with.");
}
public new void OnlyInAbstract()
{
Console.WriteLine("Looks like we are making an all new OnlyInAbstract method in child class.");
}
}
static void Main(string[] args)
{
AbstractClass abstractClass = new FirstChild();
abstractClass.MustImplement();
abstractClass.OnlyInAbstract();
(abstractClass as FirstChild).OnlyInAbstract();
abstractClass.OnlyInAbstractForNow();
Console.Read();
}