繁体   English   中英

C#在继承的所有子级别中强制执行方法,并使用基本实现

[英]C# Force method implementation in all sub-levels of inheritance and use base implementation

我有一个BaseClass,它实现了一种方法来填充自身以形成不同的数据结构。 子类会将其属性添加到基础属性中。 我希望所有子类和子子类都实现自己的方法版本,并调用其父类来执行相同的操作。 因此,这不仅仅是覆盖,我想强制实现,但方法的每个实现都必须被调用,而不仅仅是覆盖。

有点像:

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);

填充对象的所有属性。

我可以将第一个虚拟化并在派生的虚拟化中重写,但这并不会强制实现。 并且在此基础之上创建抽象基础或使用接口不会强制实现所有继承级别。

理想的情况是强制所有派生类实现其版本并调用其父级的版本(甚至更好的是,具有某种扩展/覆盖,该扩展/覆盖可从实例化对象的类向上自动调用该方法的所有实现)。

我能得到多近的距离?

看到为什么需要这种重写,我坚信您应该尝试将此逻辑移至构造函数,因为现在看来:

Derived2 object = new Derived2();
object.fromDictionary(dictionary);

您的object只有在具有dictionary才有效。 因此,而不是使用的方法从字典构建它,你应该提供接收字典作为参数的构造函数:

Derived2 object = new Derived2(dictionary);

现在,您已经有了一个有效的对象。 有更多的原因为什么您应该这样做而不是使用构成对象的方法,正如您观察到的那样,一个原因是每个子类都需要调用基本方法,并具有这种构造函数(假设您不会提供无参数的方法)一)将强制继承者将基类称为基一。

使用这种方法的另一个优点是,您将fromDictionary()开始就有一个有效的对象,而不用通过忘记调用fromDictionary()方法而使fromDictionary()用户可以制作无效的对象。

感谢大家的建议,我能得到的最接近的是:

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()方法,则将跳过除第一个/基类之外的所有父类实现,而不会出现任何编译警告或错误。 为了在各个级别强制实施,我想我可以将abstract方法放在Interface中,并让所有类都实现该接口,该接口本身不能强制执行,但与我想像的尽可能接近。

如果有人知道一种完全强迫所有人实施相同方法的方法,那将是一流的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM