我有此设置:
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");
}
}
现在,我想强制Class01 / Element02 / Element03等类来实现method01。 我认为正确的方法是使用接口。 但是由于Element01 / Element02 / Element03等继承自BaseElement,因此无需在Element01 / Element02 / Element03等中实现method01,因为它已在BaseElement中实现。但是我想强制Element01 / Element02 / Element03等在每个这些类中实现特定的method01。另一方面,我还需要BaseElement中的method01来处理Element01 / Element02 / Element03等,以作为BaseElement。 最好的方法是什么?
(与抽象和虚函数之间的区别无关。我需要接口或抽象类的特定安排。)
答案 0 :(得分:0)
如果我正确理解了这个问题,则您在基类中具有一些默认行为,并且您需要强制在派生类中实现一些逻辑,则可以使用“控制反转”原理,Template method Design pattern您必须制作另一个内部方法,例如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()
{
}
}
答案 1 :(得分:0)
创建两个界面。一个用于基类,另一个用于子类。并在 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");
}
}
答案 2 :(得分:0)
使用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");
}
}
话虽如此,我想了解您为什么有这些要求。可能有一种更简单的方法。