系统类
public class View
{
//5 different constructors
public virtual bool OnTouchEvent(MotionEvent e)
{
//Can't see inside
}
}
我需要覆盖此OnTouchEvent
,所以我尝试了这样:
public class MyClass : SystemClass
{
public override View GetCellCore(/*params*/)
{
View v = base.GetCellCore(/*params*/);
MyView mv = (MyView)mv;
return mv;
}
private class MyView : View
{
//Implementation of the 5 different constructors
public override bool OnTouchEvent(MotionEvent e)
{
//Do something
return base.OnTouchEvent(e);
}
}
}
我需要覆盖此OnTouchEvent
,以便我可以获取触摸信息。
答案 0 :(得分:3)
您尝试做的事情无法正常工作,原因与此无关:
object obj = new object();
Dog dog = (Dog)object;
Dog
继承自object
,因为它继承自Animal
(因为所有内容都来自object
。)但您可能会明白为什么它不会感觉能够做到这一点。仅作为一个例子:
Animal cat = new Cat();
Dog dog = (Dog)cat;
object date = DateTime.Now;
Dog dog = (Dog)date;
如果对象可以通过这种方式进行转换,那么任何东西都可以像其他任何东西一样进行转换,而类型没有意义。
另一种看待它的方法是一个对象只有一种类型。如果您创建Dog
的实例,则该对象的类型为Dog
。永远不会有任何其他东西。它可以作为其基类型之一进行转换,也可以作为它实现的接口进行转换,但这并不会改变它的类型。
举例说明:
Dog dog = new Dog(); // It's a Dog
Animal animal = (Animal)dog; // It's cast as an Animal, but it's still a Dog.
object obj = (object)animal; // It's cast as an object, but it's still a Dog.
也许这有助于证明转换不能也不会改变对象的类型。因此,如果Animal
已经已经 Dog
,那么将Animal
强制转换为Dog
的唯一方法就是。
像这样:
var poodle = new Poodle(); // inherits from Dog
var animal = (Animal)poodle;
var dog = (Dog)animal;
这不会引发异常,因为贵宾犬是Animal
和Dog.
如果这清除了任何混淆,在这三行代码执行之后,还有只有一个对象。我们不会创建新对象,只是引用同一对象的新变量。
答案 1 :(得分:0)
狗是动物(继承) 动物并不总是一只狗(这就是为什么它不能在你的例子中运行)但可能是(这就是它编译的原因)。
答案 2 :(得分:0)
我认为尽可能接近Dog是一个Animal构造函数。但它仍然没有多大意义。
public class Dog : Animal
{
public void Woof()
{ }
public int DogTag { get; set; } //you would have to make this up
public Dog()
{ }
public Dog (Animal animal)
{
//now the dog is nothing more than an animal
}
}
Dog dog = new Dog(animal);
答案 3 :(得分:-4)
Animal是一个系统类,对象是在内部创建的
这是不可能的,因为根本没有保证您的系统类确实是您的自定义类之一。但是,如果无法影响系统类,则可以实现自定义转换逻辑。
public sealed class SystemClass
{
}
public class CustomClass
{
private SystemClass _systemClass;
public CustomClass(SystemClass systemClass)
{
_systemClass = systemClass;
}
public static explicit operator CustomClass(SystemClass systemClass)
{
return new CustomClass(systemClass);
}
public static implicit operator SystemClass(CustomClass customClass)
{
return customClass._systemClass;
}
}
这样您就可以添加附加功能,同时保持与底层基础架构的兼容性。
var system = new SystemClass();
var custom = (CustomClass)system;