【问题标题】:how to access direcly class member's methods via wrapper class如何通过包装类直接访问类成员的方法
【发布时间】:2017-09-24 15:58:43
【问题描述】:

我有一段类似于在 C++ 中实现智能指针的方式的 sn-p 代码。

template <class T>
class WrapObject
{
public:
    WrapObject(T* data)
    {
        _data = data;
    }
    T* operator->()
    {
        return _data;
    }
private:
    T* _data;
};

class Hello
{
public:
    void sayHello()
    {
        std::cout << "hello world" << std::endl;
    }
};


int main() {
    Hello h;
    WrapObject<Hello> wh(&h);
    wh->sayHello();
    return 0;
}

在main函数中,我们可以直接从WrapObject中使用操作符'->'访问Hello对象的所有方法。

有没有办法在 C# 或 Java 中做这样的事情?

【问题讨论】:

  • Java:No。 C#:Maybe
  • 不完全是,看看java反射,看看你是否可以通过它的方法访问器得到你需要做的事情。

标签: java c# c++


【解决方案1】:

C#类型分为'值类型'和'引用类型'

引用类型(如类、接口)如C++中的指针,值保存在堆中,栈保存堆的地址。

值类型(如int、long、char、struct)存入栈。

C# 只有值类型支持指针操作(您必须在项目中设置“允许不安全代码”)。在C#中不能让引用类型在栈上分配,可以简单的认为引用类型是一个指针

    public class MyClass
    {
        public string name { get; set; }
    }

    public struct MyStruce
    {
        public string name { get; set; }
    }   

    static void Main()
    {
        //MyClass *myClass=new MyClass()
        //*myClass->name="Lee";
        MyClass myClass = new MyClass();            
        myClass.name = "Tom";

        //MyStruce myStruce;
        //myStruce.name="Jack";
        MyStruce myStruce = new MyStruce();
        myStruce.name = "Jack";
    }

您对 C# 的代码更改是

    public class WrapObject<T>
    {
        private T _data;
        public WrapObject(T data)
        {
            _data = data;
        }

        public T Data
        {
            get { return _data; }
        }
    }

    public class Hello
    {
        public void SayHello()
        {
            Console.WriteLine("hello world");
        }
    }

    static void Main()
    {
        Hello h = new Hello();
        WrapObject<Hello> wh = new WrapObject<Hello>(h);
        wh.Data.SayHello();
    }

【讨论】:

    猜你喜欢
    • 2020-09-25
    • 2020-04-29
    • 1970-01-01
    • 2012-10-08
    • 2010-12-13
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多