基于javascript原型的面向对象编程风格很有趣,但是在很多情况下你需要能够从类创建对象.
例如,在矢量绘图应用程序中,工作空间通常在绘图开始时为空:我无法从现有工作空间创建新的"行".更一般地说,动态创建对象的每种情况都需要使用类.
我已经阅读了很多教程和书"Javascript:好的部分",但在我看来,没有办法定义尊重1)封装的类和2)有效的成员方法声明(我的意思是:成员)正在定义的方法,并在每个类实例之间共享).
要定义私有变量,正在使用闭包:
function ClassA()
{
var value = 1;
this.getValue = function()
{
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是"ClassA"的每个实例都有自己的成员函数"getValue"的副本,这是无效的.
要有效地定义成员函数,正在使用原型:
function ClassB()
{
this.value = 1;
}
ClassB.prototype.getValue = function()
{
return this.value;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是成员变量"value"是公共的.
我不认为这个问题可以轻易解决,因为在创建对象期间需要定义"私有"变量(以便对象可以访问其创建的上下文,而不暴露those值)而基于原型的成员函数定义必须在对象创建后完成,因此原型有意义("this.prototype"不存在,我已经检查过).
或者我错过了什么?
编辑:
首先,感谢您的有趣答案.
我只想为我的初始消息添加一点精度:
我真正想做的是拥有1)私有变量(封装是好的,因为人们只能访问他们需要的东西)和2)有效的成员方法声明(避免拷贝).
似乎简单的私有变量声明只能通过javascript中的闭包来实现,这就是为什么我专注于基于类的方法.如果有一种方法可以用基于原型的方法实现简单的私有变量声明,那对我来说没问题,我不是一个激烈的基于类的方法proponnent.
在阅读答案后,似乎简单的解决方案是忘记私有,并使用特殊的编码约定来阻止其他程序员直接访问"私有"变量...
我同意,我的标题/第一句话对于我想在这里讨论的问题有误导性.
我想加载存储为XAML文件的矢量图形(单独的文件,不在字典中),嵌入我的应用程序中,我有几个问题要做:
XAML看起来有点模棱两可,因为它可以用来表示像矢量图像这样的静态资源,或者像WPF中那样动态构建的接口.因此,我不清楚XAML矢量图像的格式:根元素应该是什么,比如svg矢量图像的"svg"标签?目前,我使用Canvas作为顶级元素,因为我想在另一个Canvas中绘制我的图形.
以编程方式加载这些文件的最佳方法是什么(我的意思是,从xaml文件创建Canvas)?我已经看过(并尝试过)使用XamlReader的不同解决方案,但没有任何效果:应用程序崩溃,调试器没有帮助(我遇到的大多数问题似乎在解析期间发生,并且错误消息不清楚).
我已经阅读http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx,但链接到处理资源文件加载的文章已经死亡,图像不是使用C#代码创建的.
我想让我的游戏与所使用的底层图形API无关(为了减少耦合,以防我想将它移植到另一个平台).
我目前正在使用SDL,最初我想将SDL_Renderer封装在GraphicAPI_SDL类中,实现我的通用GraphicAPI接口.此API将创建Image_SDL(封装SDL_Texture),它实现了我的通用Image接口.
我的问题是,当我想使用我的GraphicAPI实例渲染图像时,底层的GraphicAPI_SDL必须将Image转换为Image_SDL,以获得SDL_Texture.这样的演员是丑陋的.
处理这种情况的最佳方法是什么?我将把每个加载在一个向量中的SDL_Texture存储在我的GraphicAPI_SDL中,每个Image的实例只有一个对应于向量中纹理索引的整数,因此只有GraphicAPI_SDL类直接使用SDL,但是有一个更好的方法(例如,使用模式)?
我在对话框中使用 ListView 控件,其视觉样式设置为LV_VIEW_DETAILS(报表视图),扩展视觉样式设置为LVS_EX_GRIDLINES. 在 Windows 10 上执行时,我得到的结果是:
如您所见,标题分隔符和项目周围单元格的垂直线未对齐。标题和第一行之间也没有边框。
该问题在使用相同控件的程序中也很明显,例如 WinRAR:
有没有简单的方法来解决这个问题?
我正在尝试实现此处显示的示例[ WPF Canvas,如何使用MVVM代码动态添加子项 ],但是当我启动程序时(即使IsItemHost为Canvas设置为True)也没有显示.
我的应用程序由实体类型组成:
public class Entity
{
public Entity(int x, int y, int width, int height)
{
X = x;
Y = y;
Width = width;
Height = height;
}
public int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
实体存储在EntitiesCollection中:
public class EntitiesCollection : ObservableCollection<Entity>
{
public EntitiesCollection()
{
Add(new Entity(10, 10, 10, 10));
Add(new Entity(50, 20, 25, …Run Code Online (Sandbox Code Playgroud) wpf ×2
c# ×1
c++ ×1
class ×1
itemscontrol ×1
javascript ×1
listview ×1
mvvm ×1
oop ×1
private ×1
winapi ×1
windows-10 ×1
xaml ×1
xamlreader ×1