嵌套 类 和接口
nested classes and interfaces
(我真的很难为这个问题想出一个好的标题,如果有人想帮忙解决这个问题..)
所以我在设计某些东西时遇到了问题。本质上我有一个classA,它是由一个objects类型的B数组组成的,我只想暴露classA的接口,想保留class B 基本上对任何用户都是隐藏的。我希望能够对类型 B 及其数据执行操作,但只能通过 class A 的 interface/methods 调用 B 实例的方法。棘手的部分是我想创建一个对类型 B 的成员执行操作的方法,但我想实现一个接口,然后有一个实现该接口的 class,因为我希望我的用户能够创建他们自己的此方法的实现。我正在考虑做一些事情:
public class A
{
B[] arr;
C c;
public A(C c)
{
arr = new B[100];
this.c = c;
}
public void method1()
{
var b = new B();
b.someMethodofb(c); // pass c to the method of b
}
private class B
{
someMethodOfb(C c)
{
}
}
}
public class C : Interface1
{
public void method(B b)
{
//interface method we have implemented
}
}
我将 class B 设为私有,因为我只希望 class A 公开可用,这样发生在 class B 上的任何事情都会通过 class A 发生,这这也是我将 B 嵌套在 A 中的原因。但是由于 class B 是私有的,我能否将它用作我的 class C 方法的参数? Interface1 实现的方法将影响 B 如何执行 someMethodOfb 的内部实现,这就是为什么我认为我需要将它传递进来才能保持 class B 的隐藏性质。是否有更好的方法我如何设计这个并能够实现我在第一段中设定的目标?
我建议您为 B 的 public 已知端添加另一个接口,让 B 实现该接口并让 C 的方法使用该接口。
public interface IC {
void method(IB b);
}
public interface IB {
int Priority { get; set; }
int Urgency { get; set; }
}
public class A {
B[] arr;
IC c;
public A(C c) {
arr = new B[100];
this.c = c;
}
public void method1() {
var r = (new Random()).Next(100);
arr[r].someMethodOfB(c); // pass c to the method of b
}
private class B : IB {
public int Priority { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public int Urgency { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
internal void someMethodOfB(IC aC) {
aC.method(this);
throw new NotImplementedException();
}
}
}
public class C : IC { // user implements
public void method(IB b) {
if (b.Priority > 10 || b.Urgency > 10)
; // do something with BI using b
throw new NotImplementedException();
}
}
现在 类 的用户需要知道 IC
才能创建 C
并且他们需要知道 IB
才能编写正文C
中的方法,但他们不需要知道所有 B
或有权访问 B
.
让我们用具体的例子:)
比如说,我们有三个 类:Customer、Order 和 OrderProcessor。 Customer 和 Order 分别是代表客户和订单的实体,而 OrderProcessor 将处理订单:
public interface IOrderProcessor
{
void ProcessOrder(IOrder order);
}
public interface IOrder
{
void FinalizeSelf(IOrderProcessor oProc);
int CustomerId {get; set;}
}
public class Customer
{
List<IOrder> _orders;
IOrderProcessor _oProc;
int _id;
public Customer(IOrderProcessor oProc, int CustId)
{
_oProc = oProc;
_orders = new List<IOrder>();
_id = CustId;
}
public void CreateNewOrder()
{
IOrder _order = new Order() { CustomerId = _id };
_order.FinalizeSelf(_oProc);
_orders.Add(_order);
}
private class Order : IOrder
{
public int CustomerId {get; set;}
public void FinalizeSelf(IOrderProcessor oProcessor)
{
oProcessor.ProcessOrder(this);
}
}
}
public class ConcreteProcessor : IOrderProcessor
{
public void ProcessOrder(IOrder order)
{
//Do something
}
}
(我真的很难为这个问题想出一个好的标题,如果有人想帮忙解决这个问题..)
所以我在设计某些东西时遇到了问题。本质上我有一个classA,它是由一个objects类型的B数组组成的,我只想暴露classA的接口,想保留class B 基本上对任何用户都是隐藏的。我希望能够对类型 B 及其数据执行操作,但只能通过 class A 的 interface/methods 调用 B 实例的方法。棘手的部分是我想创建一个对类型 B 的成员执行操作的方法,但我想实现一个接口,然后有一个实现该接口的 class,因为我希望我的用户能够创建他们自己的此方法的实现。我正在考虑做一些事情:
public class A
{
B[] arr;
C c;
public A(C c)
{
arr = new B[100];
this.c = c;
}
public void method1()
{
var b = new B();
b.someMethodofb(c); // pass c to the method of b
}
private class B
{
someMethodOfb(C c)
{
}
}
}
public class C : Interface1
{
public void method(B b)
{
//interface method we have implemented
}
}
我将 class B 设为私有,因为我只希望 class A 公开可用,这样发生在 class B 上的任何事情都会通过 class A 发生,这这也是我将 B 嵌套在 A 中的原因。但是由于 class B 是私有的,我能否将它用作我的 class C 方法的参数? Interface1 实现的方法将影响 B 如何执行 someMethodOfb 的内部实现,这就是为什么我认为我需要将它传递进来才能保持 class B 的隐藏性质。是否有更好的方法我如何设计这个并能够实现我在第一段中设定的目标?
我建议您为 B 的 public 已知端添加另一个接口,让 B 实现该接口并让 C 的方法使用该接口。
public interface IC {
void method(IB b);
}
public interface IB {
int Priority { get; set; }
int Urgency { get; set; }
}
public class A {
B[] arr;
IC c;
public A(C c) {
arr = new B[100];
this.c = c;
}
public void method1() {
var r = (new Random()).Next(100);
arr[r].someMethodOfB(c); // pass c to the method of b
}
private class B : IB {
public int Priority { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public int Urgency { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
internal void someMethodOfB(IC aC) {
aC.method(this);
throw new NotImplementedException();
}
}
}
public class C : IC { // user implements
public void method(IB b) {
if (b.Priority > 10 || b.Urgency > 10)
; // do something with BI using b
throw new NotImplementedException();
}
}
现在 类 的用户需要知道 IC
才能创建 C
并且他们需要知道 IB
才能编写正文C
中的方法,但他们不需要知道所有 B
或有权访问 B
.
让我们用具体的例子:)
比如说,我们有三个 类:Customer、Order 和 OrderProcessor。 Customer 和 Order 分别是代表客户和订单的实体,而 OrderProcessor 将处理订单:
public interface IOrderProcessor
{
void ProcessOrder(IOrder order);
}
public interface IOrder
{
void FinalizeSelf(IOrderProcessor oProc);
int CustomerId {get; set;}
}
public class Customer
{
List<IOrder> _orders;
IOrderProcessor _oProc;
int _id;
public Customer(IOrderProcessor oProc, int CustId)
{
_oProc = oProc;
_orders = new List<IOrder>();
_id = CustId;
}
public void CreateNewOrder()
{
IOrder _order = new Order() { CustomerId = _id };
_order.FinalizeSelf(_oProc);
_orders.Add(_order);
}
private class Order : IOrder
{
public int CustomerId {get; set;}
public void FinalizeSelf(IOrderProcessor oProcessor)
{
oProcessor.ProcessOrder(this);
}
}
}
public class ConcreteProcessor : IOrderProcessor
{
public void ProcessOrder(IOrder order)
{
//Do something
}
}