2013-08-02 58 views
-1
I came across a lot of code in our company codebase with the following structure 



    class Base 
    { 
    public Base (var a, var b) 
    { 
     base_a = a; 
     base_b = b; 
    } 

    var base_a; 
    var base_b; 
    } 

    class Derived:Base 
    { 
    publc Derived (var a,b,c,d): base (a,d) 
    { 
     der_c = c; 
     der_d = d; 
    } 
    var der_c; 
    var der_d; 
    var der_e; 
    } 


    class Ref 
    { 
    Base _ref; 
    public Ref(var a,b,c,d) 
    { 
     _ref = new Derived (a,b,c,d) 
    } 

    public void method() 
    { 
     _ref.der_e = 444; // won't compile 
    } 
    } 

什么是初始化der_e的正确方法?引用基类并为_ref使用对象派生类有什么好处?只是使用基类引用可以容纳多个派生类对象的事实?如果是这样的话,派生类的所有成员变量都应该在构造过程中初始化(像这样:_ref = new Derived(a,b,c,d))。如果我想稍后在方法中初始化_ref.der_e怎么办?我知道我可以做到这一点(var cast_ref = _ref为Derived; cast_ref.der_e = 444),但这种看起来并不是最佳做法。拥有这样一个结构的想法是什么,以及在派生类对象构建之后初始化其成员的正确性是什么?使用基类引用对象初始化派生类成员变量

+0

你给不会在所有的编译代码 - 你不能使用'var'参数或字段(除非实际上有一个名为'var'的类)。请给出一个*逼真的例子 - 理想情况下更短,遵循.NET命名约定,并且格式更好。 –

回答

0

在单个帖子中,这些问题太多。

什么是初始化der_e的正确方法?

为了初始化der_e你必须有Derived类的参考,因为它知道的der_e财产,而不是Base类。

引用基类并使用 对象派生类用于_ref有什么好处?

是的,这就是所谓的Polymorphism这是面向对象编程的本质。它允许我们在不知道实际实现的情况下持有各种具体实现。

如果是这样的情况下,应得出 类的所有成员变量被构造本身期间初始化(这样的:_ref =新 衍生(A,B,C,d))

没有这样的规则。这取决于你的情况。如果在创建对象之后这些值不会被改变,并且在施工对象之前已经知道这些值,那么它们应该在施工期间被初始化。

同样,如果有各种情况下,像有时值已知,有时不知道,那么可以有重载构造函数,它们采取不同的参数。

如果我想稍后在方法中初始化_ref.der_e会怎样?

这非常好,它取决于你想达到的目标。这个问题不是一个具体的问题,而是一个抽象的问题,在这个问题上很难评论你想达到的目标。

我知道我能做到这一点(VAR cast_ref = _ref作为派生; cast_ref.der_e = 444),但是这看起来似乎并没有最好的做法一样。

我分享一些Java代码,因为我从Java背景

//This class knows about Base and nothing about the Derived class 
class UserOfBase{ 

    Base ref; 

    //Constructor of UserOfBase gets passed an instance of Base 
    public UserOfBase(Base bInstance){ 
     this.ref = bInstance; 
    } 

    //Now this class should not cast it into Derived class as that would not be a polymorphic behavior. In that case you have got your design wrong. 

    public void someMethod(){ 
     Derived derivedRef = (Derived)ref; //This should not happen here 
    } 

} 

我分享一些参考这将帮助你这个是它类似于C#,因为我想答案可以很长期解释。

+0

public void someMethod(){ Derived derivedRef =(Derived)ref; //这不应该发生在这里 } 您是否说这是在构造函数中相同 public UserOfBase(int a){ this.ref = new Derive(a); } – cyrux

+0

@cyrux yes这与'UserOfBase'不应该实例化具体的派生类实例是一样的。它只需要知道基地,而不是其他任何东西。请参阅依赖注入 - 即将依赖注入到UserOfBase中。 –

相关问题