C#Generic factory方法不按预期调用构造函数

时间:2018-04-17 20:07:38

标签: c# inheritance constructor

所以我有一个继承自Page(第二个后代:CreationDialog : MainPage : Page)的类型,带有无参数构造函数。我在PageFactory类中有一个静态通用工厂方法:

public static class PageFactory
{
    public static T GetInstance<T>(WebDriver driver) where T : Page, new()
    {

        T page = new T
        {
            Driver = driver
        };
        return page;
    }
}

public class Page 
{
public static T GetInstance<T>() where T : Page, new()
    {
        return PageFactory.GetInstance<T>(Utils.GetCurrentDriver());
    }
}

public class CreationDialog : MainPage, IModal
{
   public CreationDialog()
    {
        IModal _Modal = Modal.Get(WindowLocator);
    }

    IModal _Modal { get; set; }
}

Modal.Get(WindowLocator)是一个带静态参数的静态方法。

问题是 - 当我调用GetInstance<CreationDialog>()时,当_Modal中的方法稍后被调用时,我最终没有初始化_Modal和空引用异常。

调试器显示当调用get实例时,类型参数是相应的CreationDialog,那么为什么不调用它自己的构造函数呢?我错过了什么?

更新:到达CreationDialog构造函数中的断点,但是在构造函数返回到方法范围page之后,变量设置为null并且仅使用{{初始化它1}}。

我可以阅读这个主题,因为我似乎无法获得构造函数和继承权吗?

2 个答案:

答案 0 :(得分:2)

问题是本地与成员范围。改变这个:

images, depths, invalid_depths = dataset.csv_inputs(TRAIN_FILE)

def csv_inputs(self, csv_file_path):
        filename_queue = tf.train.string_input_producer([csv_file_path], shuffle=True)
        reader = tf.TextLineReader()
        _, serialized_example = reader.read(filename_queue)
        filename, depth_filename = tf.decode_csv(serialized_example, [["path"], ["annotation"]])
        # input
        jpg = tf.read_file(filename)
        image = tf.image.decode_jpeg(jpg, channels=3)
        image = tf.cast(image, tf.float32)       
        # target
        depth_png = tf.read_file(depth_filename)
        depth = tf.image.decode_png(depth_png, channels=1)
        depth = tf.cast(depth, tf.float32)
        depth = tf.div(depth, [255.0])
        #depth = tf.cast(depth, tf.int64)
        # resize
        image = tf.image.resize_images(image, (IMAGE_HEIGHT, IMAGE_WIDTH))
        depth = tf.image.resize_images(depth, (TARGET_HEIGHT, TARGET_WIDTH))
        invalid_depth = tf.sign(depth)
        # generate batch
        images, depths, invalid_depths = tf.train.batch(
            [image, depth, invalid_depth],
            batch_size=self.batch_size,
            num_threads=4,
            capacity= 50 + 3 * self.batch_size,
        )
        return images, depths, invalid_depths

对此:

logits_val = sess.run([ logits, what_do_i_have-to put here], feed_dict={keep_conv: 0.8, keep_hidden: 0.5})

虽然这会更好:

public class CreationDialog : MainPage, IModal
{
    public CreationDialog()
    {
        IModal _Modal = Modal.Get(WindowLocator);
    }

    IModal _Modal { get; set; }
}

答案 1 :(得分:1)

您将两次声明_Modal,一次作为局部变量,一次作为属性。您正在为变量赋值,要设置属性的值,只需删除类型声明。

public class CreationDialog : MainPage, IModal
{
    public CreationDialog()
    {
        _Modal = Modal.Get(WindowLocator);
    }

    IModal _Modal { get; set; }
}