![](/img/trans.png)
[英]Force calling the derived class implementation within a generic function in C#?
[英]c#, force method implementation in child class
我有这个设置:
public class BaseElement
{
public BaseElement() { }
public virtual void method01()
{
Console.WriteLine("class BaseElement method01");
}
}
public class Element01 : BaseElement
{
public Element01() { }
public override void method01()
{
Console.WriteLine("class Element01 method01");
}
}
public class Element02 : BaseElement
{
public Element02() { }
public override void method01()
{
Console.WriteLine("class Element02 method01");
}
}
现在,我想强制类Element01 / Element02 / Element03等来实现method01。 我认为正确的方法是使用接口。 但是由于Element01 / Element02 / Element03等继承自BaseElement,因此无需在Element01 / Element02 / Element03等中实现method01,因为它已在BaseElement中实现。 但是我想强制Element01 / Element02 / Element03等在每个这些类中实现特定的method01。 另一方面,我还需要BaseElement中的method01来处理Element01 / Element02 / Element03等,以作为BaseElement。 最好的方法是什么?
(它与抽象和虚函数之间的差异无关。我需要接口或抽象类的特定安排。)
如果我正确理解了这个问题,则您在基类中有一些默认行为,并且需要强制在派生类中实现一些逻辑,则可以使用控制反转原理和模板方法设计模式,您必须制作另一个内部方法,例如method01Int,它将是抽象的,所有派生类都应实现它,例如:
public abstract class BaseElement
{
public BaseElement() { }
public void method01()
{
Console.WriteLine("class BaseElement method01");
method01Int();
}
protected abstract void method01Int();
}
public class Element01 : BaseElement
{
public Element01() { }
protected override void method01Int()
{
Console.WriteLine("class Element01 method01");
}
}
public class Element02 : BaseElement
{
public Element02() { }
protected override void method01Int()
{
Console.WriteLine("class Element02 method01");
}
}
即使在派生类中没有任何逻辑,您也可以像这样实现
public class Element03 : BaseElement
{
public Element03() { }
protected override void method01Int()
{
}
}
创建两个界面 。 一个用于基类,另一个用于子类。 并在BaseElement类中显式实现method01() 。 希望能帮助到你。
class Program
{
static void Main(string[] args)
{
IBase obj = new BaseElement();
IElement obj1 = new Element01();
obj.method01();//call base
obj1.method01();
Console.ReadLine();
}
}
public interface IBase
{
void method01();
}
public interface IElement
{
void method01();
}
public class BaseElement : IBase
{
public BaseElement() { }
void IBase.method01()
{
Console.WriteLine("class BaseElement method01");
}
}
public class Element01 : BaseElement, IElement
{
public Element01() { }
public void method01()
{
Console.WriteLine("class Element02 method01");
}
}
public class Element02 : BaseElement, IElement
{
public Element02() { }
public void method01()
{
Console.WriteLine("class Element02 method01");
}
}
使用MiddleElement:
public class BaseElement
{
public BaseElement() { }
public virtual void method01()
{
Console.WriteLine("class BaseElement method01");
}
}
public abstract class MiddleElement: BaseElement
{
public abstract override void method01();
};
public class Element01 : MiddleElement
{
public Element01() { }
public override void method01()
{
Console.WriteLine("class Element02 method01");
}
}
public class Element02 : MiddleElement
{
public Element02() { }
public override void method01()
{
Console.WriteLine("class Element02 method01");
}
}
话虽如此,我想了解您为什么有这些要求。 可能有一种更简单的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.