防止使用抽象 类 作为 属性 类型
Prevent using abstract classes as property type
是否可以防止使用抽象 classes 作为 属性 类型?
我有一个抽象基础 class 在具有泛型类型的抽象 class 中继承,而后者又在具有定义类型的 classes 中继承。是否可以 "lock down" 具有泛型类型的抽象 class,所以不可能在其他 class 中将其用作 属性?
这是我的大概情况。我想防止创建像 doubleFoo2
这样的属性的可能性。 Foo<T>
应该只能在其他class中继承,不能直接作为类型使用。
由于我正在验证 PropertyType
属性及其基本类型,这导致我犯了一个错误,我花了一段时间才找到。下面是代码测试:https://dotnetfiddle.net/OMHmGv
public abstract class FooBase
{
// Various generic properties and methods
}
public abstract class Foo<T> : FooBase
{
public Type ValueType { get { return typeof(T); } }
public abstract T Value { get; set; }
}
public class DoubleFoo : Foo<double>
{
public override double Value { get; set; }
}
public class FooHandler
{
public DoubleFoo doubleFoo1 { get; set; }
public Foo<double> doubleFoo2 { get; set; }
}
这不仅不可能,而且违背了面向对象编程的三个基本原则之一 - 当然,我说的是 polymorphism。
放弃多态性就是完全放弃面向对象编程。
重点是类型的引用实际上可以引用从引用类型派生的任何类型的实例。
多态性使以下代码行完全有效(即使不是很有用):
object s = "the type is actually a string but the reference is of type object";
编辑:正如@Zohar Peled 所说,它违背了多态性的目的,基于名称空间或程序集限制使用是您唯一的方法。
如果 DoubleFoo 及其子 类 是在单独的程序集中创建的,您可以使用
internal
修饰符而不是
public
对于 FooBase 和 Foo 类 以防止其他程序集访问它们。
如果你必须在同一个程序集中使用这个 DoubleFoo,你可以尝试将基础 类 放在不同的命名空间中以隐藏基础实现 类。
一个例子是:
里面FooOfT.cs
namespace FooTester.DoubleFoo.Foo
{
public abstract class FooBase
{
// Various generic properties and methods
}
public abstract class Foo<T> : FooBase
{
public Type ValueType { get { return typeof(T); } }
public abstract T Value { get; set; }
}
}
里面DoubleFoo.cs
using FooTester.DoubleFoo.Foo
namespace FooTester.DoubleFoo
{
public class DoubleFoo : Foo<double>
{
public override double Value { get; set; }
}
}
里面FooHandler.cs
using FooTester.DoubleFoo
namespace FooTester
{
public class FooHandler
{
public DoubleFoo doubleFoo1 { get; set; }
// public Foo<double> doubleFoo2 { get; set; } Cannot access Foo<T> class
}
}
是否可以防止使用抽象 classes 作为 属性 类型?
我有一个抽象基础 class 在具有泛型类型的抽象 class 中继承,而后者又在具有定义类型的 classes 中继承。是否可以 "lock down" 具有泛型类型的抽象 class,所以不可能在其他 class 中将其用作 属性?
这是我的大概情况。我想防止创建像 doubleFoo2
这样的属性的可能性。 Foo<T>
应该只能在其他class中继承,不能直接作为类型使用。
由于我正在验证 PropertyType
属性及其基本类型,这导致我犯了一个错误,我花了一段时间才找到。下面是代码测试:https://dotnetfiddle.net/OMHmGv
public abstract class FooBase
{
// Various generic properties and methods
}
public abstract class Foo<T> : FooBase
{
public Type ValueType { get { return typeof(T); } }
public abstract T Value { get; set; }
}
public class DoubleFoo : Foo<double>
{
public override double Value { get; set; }
}
public class FooHandler
{
public DoubleFoo doubleFoo1 { get; set; }
public Foo<double> doubleFoo2 { get; set; }
}
这不仅不可能,而且违背了面向对象编程的三个基本原则之一 - 当然,我说的是 polymorphism。
放弃多态性就是完全放弃面向对象编程。
重点是类型的引用实际上可以引用从引用类型派生的任何类型的实例。
多态性使以下代码行完全有效(即使不是很有用):
object s = "the type is actually a string but the reference is of type object";
编辑:正如@Zohar Peled 所说,它违背了多态性的目的,基于名称空间或程序集限制使用是您唯一的方法。
如果 DoubleFoo 及其子 类 是在单独的程序集中创建的,您可以使用
internal
修饰符而不是
public
对于 FooBase 和 Foo 类 以防止其他程序集访问它们。
如果你必须在同一个程序集中使用这个 DoubleFoo,你可以尝试将基础 类 放在不同的命名空间中以隐藏基础实现 类。 一个例子是:
里面FooOfT.cs
namespace FooTester.DoubleFoo.Foo
{
public abstract class FooBase
{
// Various generic properties and methods
}
public abstract class Foo<T> : FooBase
{
public Type ValueType { get { return typeof(T); } }
public abstract T Value { get; set; }
}
}
里面DoubleFoo.cs
using FooTester.DoubleFoo.Foo
namespace FooTester.DoubleFoo
{
public class DoubleFoo : Foo<double>
{
public override double Value { get; set; }
}
}
里面FooHandler.cs
using FooTester.DoubleFoo
namespace FooTester
{
public class FooHandler
{
public DoubleFoo doubleFoo1 { get; set; }
// public Foo<double> doubleFoo2 { get; set; } Cannot access Foo<T> class
}
}