如何在只能使用附加分配设置的类中创建属性。我知道事件在C#中以这种方式工作。我想知道如何在自己的代码中实现该构造。
例如。对于活动,我可以执行以下操作
public event EventHandler myEventHandler;
myEventHandler += NewEvent;
这会将NewEvent
添加到调用myEventHandler
时运行的事件链中。
我希望能够做类似的事情。我想创建一个Graph
类,该类为带有节点和连接的数学图建模。 Graph
类将具有nodes
属性,该属性只能添加或删除节点,而不能设置为整个属性。
再次使用EventHandler
示例,我将无法对EventHandler
进行以下操作
myEventHandler = OnlyOneEventWillRun;
我还希望能够对附加分配实现类似于set{}
访问器的逻辑。
答案 0 :(得分:2)
对于初学者来说,Sub GetOtherWorkbook()
Dim wbWithMacro As Workbook
Dim wbOther As Workbook, wb As Workbook
Set wbWithMacro = Me.Parent 'Assumes macro is in a "Sheet" code container
'Set wbWithMacro = Me 'Assumes macro is in "ThisWorkbook" code container
For Each wb In Workbooks
If Not wb Is Me Then
Set wbOther = wb
Exit For
End If
Next
Debug.Print wbWithMacro.Name, wbOther.Name
End Sub
是一个多播委托-您可以自己镜像该功能,但这并不能真正解决您所说的问题。
我将采用的方法是使用私有设置器(或根本不使用任何设置器)-这将允许您从定义属性的类中设置值(大概您会知道并记住您在做什么) ),但不是来自课堂之外(其他开发人员可能不经意间将其搞砸了):
myEventHandler
答案 1 :(得分:1)
Graph类将具有一个节点属性,该属性只能 可以添加或删除节点,但不能将其设置为整体属性。
虽然这对于封装非常有用,但实现它的方法比重载+=
运算符的方法更简单,更明显。
这里是一个例子:
class Graph
{
private List<Node> nodes;
public ReadOnlyCollection<Node> Nodes
{
get { return new ReadOnlyCollection<Node>(nodes); }
//note no setter
}
public void AddNode(Node node)
{
//whatever additional logic you need
nodes.Add(node);
}
}
如果您想使您的API更流畅,可以将Graph
对象本身作为AddNode
的返回值,因此可以将其与链接添加一起使用:
graph.AddNode(node1)
.AddNode(node2)
.AddNode(node3);
和/或接受节点的params
数组参数,以便可以将其称为:
graph.AddNode(node1, node2);
graph.AddNode(node3);