我正在尝试使用泛型继承结构,请参阅。
public class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
{
private struct AuditLogEntryStruct
{
public int AuditID;
}
}
public abstract class ObjectBase<T>
{
}
它不会让我为我的struct使用private,因为它会抛出错误: 可访问性不一致:基类'ObjectBaseAuditLogEntry.AuditLogEntryStruct&gt;'比“AuditLogEntry”类更容易访问。
但是我真的不想公开我的结构。 有任何想法吗? 谢谢, 亚历
关注问题:
以下是我们要做的事情:
class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
{
internal struct AuditLogEntryStruct
{
public int AuditID;
}
public int AuditID
{
get
{
return udtObject.AuditID;
}
set{
BeginEdit();
udtObject.AuditID = value;
}
}
class ObjectBase<T>
{
protected T udtObject;
protected T udtPreEditObject;
protected void BeginEdit()
{
if (!IsDirty)
{
IsDirty = true;
udtPreEditObject = udtObject;
}
}
}
我不确定如何在公开AuditLogEntryStruct的过程中实现这一目标? 谢谢, 亚历
答案 0 :(得分:2)
当一个或多个类型参数不公开时,您无法从泛型类派生公共类
任何类型派生的类型必须像派生类一样可访问,包含作为基类的类型参数给出的任何类型参数
如果你有
public class publicClass{}
如果您将其更改为
,则任何类都可以从A派生internal class internalClass{}
只有其他内部类可以从中派生出来。
如果您将任一类型作为类型参数传递,情况也是如此。下面的前三个是有效的,第四个不是
public class A : List<publicClass>{}
internal class B : List<internalClass>{}
internal class C : List<publicClass>{}
//not valid because D has wider accessibility than the close generic type List<internalClass>
public class D : List<internalClass>{}
修改强> 语言团队在某些时候必须决定是否宣布您的声明无效,或者使用您的类型导致非法访问无法访问的类型无效。在你的情况下,会有几个方法返回一个类型,这个类型对于除了类之外的所有其他类型都是不可访问的,并且有许多方法采用其他类没有提供的类型的参数。因此,实际上能够使用类对象的唯一对象将是您的类的对象。你可以用组合而不是继承来解决这个问题
public class AuditLogEntry
{
private ObjectBase<AuditLogEntry.AuditLogEntryStruct> _entry;
private struct AuditLogEntryStruct
{
public int AuditID;
}
}
public abstract class ObjectBase<T>
{
}
答案 1 :(得分:0)
考虑这个例子:
public class Foo : List<Bar>
{
private struct Bar { }
}
var myFoo = new Foo();
...
var x = myFoo()[0]; // expression on the right side is of type Bar, yet Bar is inaccessible
<强>更新强>
你想要实现的并不需要泛型。您只能访问ObjectBase<T>
内的结构,就好像它们是对象一样。您也可以将它们更改为object
并完全删除泛型类型。
如果你有更多的逻辑要求AuditLogEntryStruct
中的某些功能可以在ObjectBase<T>
中访问,你可以提取一个接口:
public interface IStructsWithSomeFunctionality { ... }
让你的struct实现它并将它用作你的类型参数
public class AuditLogEntry : ObjectBase<IStructsWithSomeFunctionality> { ... }