我有一个BaseClass,它实现了一种方法来填充自己形成不同的数据结构。 SubClasses将其属性添加到基础属性。我希望所有子类和子子类都实现自己的方法版本,并调用它们的父类来做同样的事情。所以这不仅仅是重写,我想强制实现,但是必须调用方法的每个实现,而不仅仅是重写。
类似:
class BaseClass
{
int id;
virtual void fromDictionary(Dictionary data)
{
id = data["id"];
}
}
class Derived1 : BaseClass
{
string name;
override void fromDictionary(Dictionary data)
{
name = data["name"];
base.fromDictionary(data);
}
}
class Derived2 : Derived1
{
float size;
override void fromDictionary(Dictionary data)
{
size = data["size"];
base.fromDictionary(data);
}
}
然后这样做:
Derived2 object = new Derived2();
object.fromDictionary(dictionary);
填充所有对象的属性。
我可以将第一个虚拟并覆盖在派生的虚拟中,但这并不会强制实现。在这个基础之上或使用接口创建一个抽象基础不会强制实现所有级别的继承。
理想情况是强制所有派生类实现其版本并调用其父版本(或者甚至更好,具有某种扩展/覆盖,从实例化对象中自动调用该方法的所有实现&# 39; s级向上)。
我能接近多少?
答案 0 :(得分:1)
看看你为什么需要这种覆盖我坚信你应该尝试将这个逻辑移到构造函数,因为它现在看起来:
Derived2 object = new Derived2();
object.fromDictionary(dictionary);
object
仅在dictionary
有效时才有效。因此,您应该提供一个接收字典作为参数的构造函数,而不是使用方法从字典中构造它:
Derived2 object = new Derived2(dictionary);
现在你有一个来自开始的有效对象。你应该这样做的原因有很多,而不是使用组成你的对象的方法,你观察到的是每个子类需要调用基类方法,并且有这种构造函数(假设你不提供无参数的方法)一个)将迫使继承人打电话给基地。
使用这种方法的另一个好处是,您将从一开始就拥有一个有效的对象,而不是通过忘记调用fromDictionary()
方法使该类的用户能够生成无效对象。
答案 1 :(得分:0)
感谢大家的建议,我能得到的最接近的是:
public abstract class DAO
{
public long id { get; set; }
public void fromDictionary(Dictionary<string, object> obj)
{
//Does own part in the method
id = (long)obj["id"];
//Calls most derived implementation
fromDictionaryOperation(obj);
}
//Forces child to implement its part
protected abstract void fromDictionaryOperation(Dictionary<string, object> obj);
}
//Is forced to implement its part, and the base implementation will be executed always
public class Area : DAO
{
public string name { get; set; }
protected override void fromDictionaryOperation(Dictionary<string, object> obj)
{
name = (string)obj["name"];
}
}
//Is NOT forced to implement method, and MUST call base.fromDictionary() for all this to work properly, but is NOT FORCED TO.
public class CircularArea : Area
{
public float radius { get; set; }
protected override void fromDictionaryOperation(Dictionary<string, object> obj)
{
radius = (float)obj["radius"];
base.fromDictionary(obj);
}
}
因此所有第二代类都没问题,但后续的子类不会被迫实现其部分或调用父实现。这意味着如果在子子类的实现中,不调用base.fromDictionary()方法,则将跳过除第一个/基类之外的所有父类实现,而不会发生任何编译警告或错误。 为了强制在所有级别实现,我想我可以将抽象方法放在一个接口中,并使所有类实现接口,而这个接口不能被强制使用,但是尽可能接近我的想法。
如果有人知道如何完全强制他们所有人实施相同的方法,那将是一流的。