我=对象(C#:This = object)

时间:2014-02-06 20:14:08

标签: c# vb.net parsing constructor overloading

简而言之,我只是想知道,是否(以及如何)我可以做Me = object这样的事情?

(在C#中:This = object

给定的对象是同一个类,只是另一个实例。 我在谷歌和论坛搜索中找不到任何关于它的信息。

背景:

这不是一个真正的问题,但困扰我。 基本上我想摆脱下面的init()函数(类似VB.net的伪代码)。

class foo

   ' init() is called by all constructors '
   private sub init(bar1, bar2)
       #do quite some stuff, initialize members, ...
   end sub

   ' heavy constructor overloading '
   public sub new(...)
   public sub new(...)

   ' a constructor that is supposed to parse a string     '
   public sub new(String)
      #do parsing, then call init() with the extracted information
   end sub

   ' a parser '
   public shared function Parse (String) as foo
      #do parsing and return new foo
   end function
end class

现在我的实际“问题”。有不同的方法来解决这个问题:

1)我可以在字符串构造函数中调用.parse-function。 - > string-constructor将创建对象foo1 - >然后它将调用解析器,它将从字符串中提取信息,然后创建一个新对象foo2(通过使用提取的信息调用正确的构造函数) - > foo2正是我想要的foo1,所以调用Me = foo2可以解决我的问题。但我不知道有什么方法可以做到这一点,或者只是将foo2“返回”给构造函数的调用者。

相反,我必须调用init(foo2.information)然后设置foo1.information = foo2.information 所以简而言之,我的构造函数通过Parse()创建foo1,然后创建foo2,然后通过init()将foo2复制到foo1 - >低效

2)我可以在.parse-function中调用string-constructor。 - > string-constructor首先必须从字符串中提取所有信息 - >然后它可以使用该信息调用我的默认构造函数...等待否......它不能。这是因为在构造函数中,我只能在第一行代码中调用其他构造函数。因此我必须创建一个名为init()的辅助子,它取代了我常用的构造函数。 helper-sub使这个解决方案成为一个很好的工作解决方案,但我不知道为一个单独的案例提供了额外的sub ...

所以这绝对没什么大不了的,但这让我很烦恼。 还有另一种解决方法吗?

提前感谢分配, 贾尼斯

PS:拥有Parse(string)和new(string)意味着提高类的可用性

2 个答案:

答案 0 :(得分:4)

语法:

this = something

仅允许struct类型,而不是类。

因此,答案是否定的,这是不可能的(因为你指的是对象)。

答案 1 :(得分:2)

问题的答案是:你不能这样做。

解决潜在问题的方法如下。

让您的Parse变为私有,并返回您的基础构造函数(或init())可以接受的内容。然后在一行上调用Parse,您可以调用另一个构造函数。我将在下面使用C#,但想法是一样的:

public class MyClass {
    private MyClass(ResultsOfParse data) {
        ...
    }
    public MyClass(string data) : this(Parse(data)) {
        // nothing to do, the other constructor did all the work
    }
    private static ResultsOfParse Parse(string data) {
        // parse the string
        // put all necessary data into ResultsOfParse and return it
    }

    private class ResultsOfParse {
        // contains everything the constructor of MyClass needs
    }
}